---
type: test-report
work_item_id: ORCH-087
result: PASS
---

# Test Report — ORCH-087

Багфикс live-трекера: зачистка осиротевших карточек (G1), эффорт в строке стадии
(BR-EFF), честное итоговое время (BR-G5), плюс deploy-цикл на карточке (G3).
Review-вердикт `12-review.md` — **APPROVED**. Прогнан полный регресс + smoke API.

## Окружение
- Python: 3.12.13
- pytest: 8.3.3
- Ветка: `feature/ORCH-087-orch-87-to-analyse-bump`
- Репозиторий: orchestrator (worktree)
- Прод-инстанс (8500): health `ok` — деструктивных операций не выполнялось
- Дата: 2026-06-09

## Результаты — тест-план (04-test-plan.yaml)

| TC ID | Описание | Тест(ы) | Результат |
|-------|----------|---------|-----------|
| TC-01 | bump удаляет ВСЕ незакрытые message_id, не только последний | `test_notifications_orphans.py` | PASS |
| TC-02 | send→None → учёт mid не теряется (BR-6/R-3) | `test_notifications_orphans.py` | PASS |
| TC-03 | delete=False (transient) остаётся в учёте; «already gone» исключается | `test_notifications_orphans.py` | PASS |
| TC-04 | повторные вызовы → одна живая карточка, ≤1 send, без дублей | `test_notifications_orphans.py` | PASS |
| TC-05 | учёт mid переживает «рестарт» (читается из БД) | `test_notifications_orphans.py` | PASS |
| TC-06 | plane_status_label детерминирован для created..done; deploy→Awaiting Deploy | `test_tracker_status_line.py` (parametrized) | PASS |
| TC-07 | заголовок/статус соответствуют tasks.stage (нет застывшего To Analyse) | `test_tracker_status_line.py` | PASS |
| TC-08 | live-overlay рисует Deploying/Monitoring; деградирует на offline при kill-switch | `test_tracker_status_line.py` | PASS |
| TC-09 | миграция agent_runs.effort идемпотентна (_ensure_column) | `test_launcher.py` / db-fallback тесты | PASS |
| TC-10 | launcher стампит resolve_agent_effort в agent_runs.effort при запуске | `test_launcher.py` (effort, 2 теста) | PASS |
| TC-11 | строка стадии рендерит эффорт рядом с моделью; dev=xhigh, tester/deployer=medium, прочие=high | `test_tracker_effort_time.py` | PASS |
| TC-12 | пустой/неизвестный effort → суффикс опускается, рендер не падает | `test_tracker_effort_time.py` | PASS |
| TC-13 | brd_review ~6ч (застой) → «твоё время» НЕ показывает ~6ч (cap) | `test_tracker_effort_time.py` | PASS |
| TC-14 | agent-время = Σ agent_runs точно; 💰-итоги без регресса | `test_tracker_effort_time.py` | PASS |
| TC-15 | done-строка: wall помечен «общее (с ожиданием)»; числа согласованы | `test_tracker_effort_time.py` | PASS |
| TC-16 | update_task_tracker/render никогда не raise при ошибке Telegram/БД | `test_tracker_status_line.py` / `test_notifications_orphans.py` | PASS |
| TC-17 | ссылки ORCH-067 (plane_issue_link) и disable_web_page_preview ORCH-080 сохранены | `test_tracker_issue_link.py` | PASS |
| TC-18 | staging-воспроизведение (G0): одна актуальная карточка без сирот | ADR-001 (таблица воспроизведения) | PASS (по ADR) |
| TC-19 | merge-gate: ветка поверх origin/main с ORCH-86; reconciler не эродирован; pytest зелёный | `git merge-base` + регресс | PASS |

## Критерии приёмки (03-acceptance-criteria.md)
- **G0 (AC-0.x):** ADR-001 присутствует, отвечает на 4 вопроса §4 BRD, содержит таблицу
  staging-воспроизведения и known-limitation 48ч → PASS.
- **G1 (AC-1.x):** леджер `tracker_messages`, мульти-mid зачистка, send→None защита,
  unit-покрытие зелёное → PASS.
- **G2/G3 (AC-2.x/3.x):** plane_status_label детерминирован для всех стадий; ключ
  `confirm_deploy` в `_LIVE_BRANCH_LABELS`; deploy→Awaiting Deploy offline → PASS.
- **BR-EFF (AC-E.x):** колонка `agent_runs.effort` идемпотентна, стамп в `_spawn`,
  рендер `· model · effort`, значения по ORCH-41/081 → PASS.
- **BR-G5 (AC-5.x):** три подписанных метрики, cap `tracker_brd_review_cap_s`,
  agent-сумма точна → PASS.
- **BR-G6 (AC-6.x):** `git merge-base --is-ancestor origin/main HEAD` → TRUE;
  `src/reconciler.py` — 35 вхождений маркеров ORCH-086 (`skipped_terminal_total`/
  `state_uuid`), логика не эродирована → PASS.
- **Сквозные (AC-X.x):** одна карточка/≤1 send; полный pytest зелёный (never-raise);
  доки обновлены; ссылки/preview сохранены; STAGE_TRANSITIONS/QG_CHECKS не тронуты → PASS.

## Smoke test API (прод 8500, read-only)
- `GET /health` → `{"status":"ok","service":"orchestrator"}`
- `GET /status` → отвечает; active_tasks включает ORCH-087 (stage `testing`)
- `GET /queue` → отвечает; `counts.running=1`, reconcile/reaper/post_deploy/merge_verify
  блоки в норме; `skipped_terminal_total` присутствует (ORCH-086 наблюдаемость жива)

## Вывод pytest
```
============================= test session starts ==============================
platform linux -- Python 3.12.13, pytest-8.3.3
collected 1090 items
...
======================= 1090 passed, 1 warning in 29.87s =======================
```
(1 warning — PydanticDeprecatedSince20 в `src/config.py`, не связана с задачей.)

ORCH-087-специфичные модули (повторный прогон):
- `test_notifications_orphans.py` — 7 passed
- `test_tracker_effort_time.py` — 12 passed
- `test_tracker_status_line.py` — 18 passed
- `test_tracker_bump.py` + `test_tracker_bump_default.py` — 21 passed
- `test_launcher.py -k effort` — 2 passed

## Итог
**PASS** — все 1090 тестов зелёные, smoke API OK, все критерии приёмки выполнены,
инварианты (never-raise, одна карточка, STAGE_TRANSITIONS/QG неизменны, BR-G6
свежий main без эрозии reconciler) соблюдены. Задача готова к стадии deploy-staging.
