--- type: review work_item_id: ORCH-067 verdict: APPROVED version: 2 --- # Review ORCH-067 ## Summary Повторное ревью после фикса документации (коммит `7a88f39`). Реализация полностью соответствует ТЗ (`02-trz.md`), ADR-001 и всем acceptance criteria (`03-acceptance-criteria.md`). **Код** (`src/notifications.py` — ядро): - **Req 1 (bump):** дефолт `tracker_mode` сменён `edit → bump` (`src/config.py`); логика `update_task_tracker`, транспорт `send/edit/delete_telegram`, `disable_notification` и инвариант «одна карточка на задачу» не тронуты (AC-1..AC-4, AC-15 ✓). - **Req 2 (статус-строка):** чистый never-raise `plane_status_label(task_row)` (offline-ядро: stage→статус + `⏸️ In Review` из brd-clock + `⏸️ Awaiting Deploy`, всё без сети) + best-effort `_live_plane_branch_override` для ветвей, неотличимых offline (Needs Input / Blocked / Rejected / Cancelled / Deploying / Monitoring). Kill-switch (`tracker_live_status`), per-issue TTL-кэш (`_LIVE_STATE_CACHE`), короткий таймаут (`fetch_issue_state(..., timeout=)`, дефолт 10 сохранён → нет регресса reconciler). Anti-false-positive guard для enduro (`_LIVE_BRANCH_BASE`: deploying/monitoring override только при отдельном UUID). Прецеденс In Review > overlay соблюдён. `_card_status_label` обёрнут в try/except → рендер никогда не падает (AC-5..AC-9 ✓). - **Req 3+4 (кликабельный номер):** единый `_plane_issue_url` устраняет дублирование резолва проекта/loopback-guard (ORCH-017); `plane_issue_link` (текст=номер) и `_build_plane_issue_link` (текст=«✅ Задача в Plane») оба зовут его. `link_for` fail-safe достаёт `repo`/`plane_issue_id` из БД. Применено в заголовке карточки и во ВСЕХ точках §3.3 с номером задачи (AC-10..AC-14 ✓). **Точки §3.3 проверены пофайлово:** `notify_approve_requested`, `notify_error`, `stage_engine.py` (все alert'ы с номером), `agents/launcher.py`, `security_gate.py`, `reconciler.py` — номер кликабелен. `merge_gate.py`/`job_reaper.py`/`main.py` оставлены без ссылки **осознанно и корректно**: их тексты ссылаются на repo/job/run_id, а НЕ на `work_item_id` (проверено: merge_gate:432 — lease/repo, job_reaper:396 — job/agent/repo, main:47 — orphaned run_ids). **Инварианты/нерегресс:** схема БД, `STAGE_TRANSITIONS`, QG, транспорт — не тронуты (AC-15 ✓). `get_db()` возвращает новое соединение на вызов, поэтому `conn.close()` в `link_for` корректен. `pytest tests/ -q` → **907 passed** (AC-16, AC-17 ✓). **Документация (блокеры v1 закрыты):** `CHANGELOG.md`, `CLAUDE.md`, `.env.example` обновлены в коммите `7a88f39`; ADR-001 присутствует и полон; `README.md`/`internals.md` синхронизированы (AC-18 ✓). ## Findings ### P0 — Blocker - (нет) ### P1 — Must fix - (нет) ### P2 — Should fix - (нет) ### P3 — Nice to have (не блокирует) - [ ] Часть alert-сообщений в `stage_engine.py` (`_handle_self_deploy_phase_b`, `_handle_merge_verify`) встраивает «сырой» `{msg}`/`{e}`/`{reason}` рядом с новой ``-ссылкой; под `parse_mode=HTML` редкий `<` в этих подстановках теоретически мог бы помешать рендеру. Это **пре-существующее поведение** (parse_mode=HTML стоял и раньше), не регресс данной задачи; `notify_error` свой `error` экранирует. Можно при случае обернуть прочие подстановки в `html.escape`. ## Документация - `docs/architecture/README.md` — обновлён (компонент Notifications / live-tracker). ✓ - `docs/architecture/internals.md` — обновлён (§7: bump/edit, Plane-статус, кликабельный номер). ✓ - `06-adr/ADR-001-tracker-plane-status-and-link.md` — присутствует, полный, закрывает все `[ARCH]`. ✓ - `CHANGELOG.md` — обновлён (запись ORCH-067). ✓ - `CLAUDE.md` — обновлён (раздел «Нотификации / Telegram live-tracker»). ✓ - `.env.example` — синхронизирован (`ORCH_TRACKER_MODE=bump` + новые флаги live-overlay). ✓ Документация = golden source: код и доку обновлены в одном PR. Блокеры предыдущего ревью (v1) закрыты. Замечаний уровня P0/P1/P2 нет → **APPROVED**.