work_item: ORCH-087 description: > Тест-план для багфикса live-трекера (сироты/заголовок/deploy-цикл), эффорта-в-карточке, честного итогового времени. Юнит-тесты — pytest, изоляция Telegram через monkeypatch (send/edit/delete не ходят в сеть). Интеграция/воспроизведение — на staging (8501). Контракт never-raise проверяется отдельными negative-тестами. tests: # ---------------- G1: зачистка сирот ---------------- - id: TC-01 type: unit description: "bump удаляет ВСЕ известные незакрытые message_id задачи, не только последний (мок delete/send)" module: tests/test_notifications_orphans.py expected: PASS - id: TC-02 type: unit description: "send вернул None (нет креды/transient) → учёт прежних message_id не теряется, mid не обнуляется (BR-6 + R-3)" module: tests/test_notifications_orphans.py expected: PASS - id: TC-03 type: unit description: "delete вернул False (transient, >48ч) → message_id остаётся в учёте для повторной попытки; 'already gone' (_DELETE_GONE_MARKERS) → исключается из учёта" module: tests/test_notifications_orphans.py expected: PASS - id: TC-04 type: unit description: "повторные вызовы update_task_tracker подряд (быстрые стадии/гонка) → ровно одна живая карточка, ≤1 send за вызов, без дублей (AC-X.1)" module: tests/test_notifications_orphans.py expected: PASS - id: TC-05 type: unit description: "учёт message_id переживает 'рестарт' (читается из БД) → старые карточки подчищаются при следующем bump (AC-1.3)" module: tests/test_notifications_orphans.py expected: PASS # ---------------- G2/G3: заголовок и deploy-цикл ---------------- - id: TC-06 type: unit description: "plane_status_label детерминированно даёт корректный лейбл для всех stage created..done; deploy → 'Awaiting Deploy' (AC-2.2, AC-3.1)" module: tests/test_notifications.py expected: PASS - id: TC-07 type: unit description: "render_task_tracker: заголовок/статус-строка соответствуют tasks.stage на каждой стадии (нет застывшего To Analyse) (AC-2.1)" module: tests/test_notifications.py expected: PASS - id: TC-08 type: unit description: "live-overlay рисует Deploying/Monitoring при наличии соответствующего Plane-UUID; деградирует на offline-label при ошибке/выкл. kill-switch (AC-3.2)" module: tests/test_notifications.py expected: PASS # ---------------- BR-EFF: эффорт в карточке ---------------- - id: TC-09 type: unit description: "миграция agent_runs.effort идемпотентна (_ensure_column дважды — без ошибки) (AC-E.1)" module: tests/test_db.py expected: PASS - id: TC-10 type: unit description: "launcher стампит resolve_agent_effort(agent) в agent_runs.effort в момент запуска; значение = фактический --effort (AC-E.1)" module: tests/test_launcher.py expected: PASS - id: TC-11 type: unit description: "строка стадии рендерит эффорт рядом с моделью в выбранном формате; developer=xhigh, tester/deployer=medium, прочие=high (AC-E.2, AC-E.3)" module: tests/test_notifications.py expected: PASS - id: TC-12 type: unit description: "пустой/неизвестный effort → суффикс эффорта опускается, рендер не падает (AC-E.4)" module: tests/test_notifications.py expected: PASS # ---------------- BR-G5: честное время ---------------- - id: TC-13 type: unit description: "brd_review-окно ~6ч (искусственный застой) → итоговое 'твоё время' НЕ показывает ~6ч (отсечка/активные окна) (AC-5.1)" module: tests/test_notifications.py expected: PASS - id: TC-14 type: unit description: "agent-время = Σ _duration_seconds(agent_runs) точно; 💰-итоги без регресса (AC-5.2)" module: tests/test_notifications.py expected: PASS - id: TC-15 type: unit description: "итоговая строка done: wall помечен как 'общее (с ожиданием)' ИЛИ wall сходится с Σ(стадии)+Σ(паузы); числа согласованы (AC-5.3)" module: tests/test_notifications.py expected: PASS # ---------------- never-raise / сквозные ---------------- - id: TC-16 type: unit description: "update_task_tracker / render_task_tracker никогда не поднимают исключение при ошибке Telegram/БД (моки бросают) (AC-X.2)" module: tests/test_notifications.py expected: PASS - id: TC-17 type: unit description: "ссылки ORCH-067 (plane_issue_link кликабельный номер) и disable_web_page_preview (ORCH-080) сохранены в payload (AC-X.4)" module: tests/test_notifications.py expected: PASS # ---------------- интеграция / воспроизведение ---------------- - id: TC-18 type: integration description: "staging-прогон задачи (8501): на каждой стадии зафиксировать (заголовок+тело в Telegram) vs (stage в БД); в чате остаётся одна актуальная карточка без сирот (G0 воспроизведение, AC-0.2, AC-1.1)" module: docs/work-items/ORCH-087/06-adr # фиксируется в ADR как таблица воспроизведения expected: PASS - id: TC-19 type: integration description: "merge-gate: ветка поверх origin/main с ORCH-86; reconciler.py не эродирован (маркеры ORCH-086 на месте), pytest tests/ -q зелёный (AC-6.1, AC-6.2, AC-X.2)" module: tests/ expected: PASS