EVCharge E2E Verify — run-verify-e2e-chat-004-20260401-1941

FAIL
Сценарий: scenarios/smoke-tests/e2e-chat-004-order-thread.md  |  Задача: E2E-CHAT-004  |  Начало: 2026-04-01 16:41 UTC  |  Конец: 2026-04-01 17:00 UTC

Вердикт: FAIL

Пройдено: V0, V1, V2, V3, V4, V4-DB, V5 (7 из 11)

Провалено: V6, V7, V8, V9, V10

Корневая причина: ThreadPreview не реализован в ChatPanel диспетчера. Ответы на thread показываются как inline-сообщения в канале. Диспетчер не может ответить в thread → клиент не получает ответ.

Дополнительно: Баг дублирования сообщений в Client ChatWidget.

Шаги сценария

# Модуль Блок Статус Детали
V0DBПодготовка — заказ в маршруте PASS Order PZ-0556 в маршруте 4a3947c3 (PLANNED), route_channel_id: odeesywc4fd5dg67noig5xia3h
V1TechnicianТехник подтверждает маршрут PASS Логин testtechnik@test.com/sova-sova. Нажал "Принять" → "Да". DB: route=IN_PROGRESS, order=ASSIGNED.
V2ClientКлиент открывает заказ PASS Заказ PZ-0556 показывает "Техник назначен", техник "Test Technik", кнопка "Написать" видна.
V3ClientChatWidget открыт PASS ChatWidget открылся в приложении (/chatNew?orderId=...), НЕ Telegram. WebSocket подключён к wss://api-test.zarady.ru.
V4ClientКлиент отправил сообщение PASS "Когда приедет техник по заказу?" отображается в ChatWidget. ⚠️ Баг: сообщение показывается дважды (BUG-002).
V4-DBDBThread создан в MM PASS mm_order_thread: order→route-channel, mm_root_post_id=g3o5hrmcajgo7yki1du474fzyc
V5MM APIThread в Mattermost корректен PASS Root post: ":speech_balloon: Чат с клиентом по заказу PZ-0556". 1 reply: ":raising_hand: Клиент Apple Moderator: Когда приедет техник по заказу?"
V6DispatcherThreadPreview в route-канале FAIL ThreadPreview НЕ реализован. Thread reply показывается как inline-сообщение от evcharge-bot. Нет индикатора "N ответов", нет collapsed block. (BUG-001)
V7DispatcherДиспетчер раскрывает thread FAIL ThreadPreview не существует — нечего раскрывать. Клик по root post ":speech_balloon:" не открыл thread panel.
V8DispatcherДиспетчер отвечает в thread FAIL Thread composer недоступен. Диспетчер отправил "Техник будет через 30 минут, уже выехал." в channel-level composer. Пост root_id=NULL (не thread reply).
V9ClientКлиент видит ответ FAIL Клиент НЕ видит ответ. Bot Service маршрутизирует только thread replies (root_id=mm_root_post_id). Ответ диспетчера без root_id не был доставлен.
V10DB+MM APIФинальная верификация FAIL Thread содержит 2 поста (root + 1 reply клиента). Ожидалось 3 (+ ответ диспетчера). mm_order_thread маппинг корректен: channel=route-20270402-technik-4a39.

Обнаруженные баги

🔴 BUG-001 (HIGH): ThreadPreview не реализован в Dispatcher ChatPanel

Описание: Thread replies к root post order-чата отображаются как inline сообщения в route-канале от evcharge-bot, а не как collapsed ThreadPreview с индикатором "N ответов". Диспетчер не может открыть thread panel и ответить в thread.

Модуль: Dispatcher (ev-dispatcher4)

Шаги воспроизведения:

  1. Клиент отправляет сообщение через order-чат
  2. Диспетчер открывает route-канал в ChatPanel
  3. Сообщение клиента отображается как отдельное сообщение от evcharge-bot, не как thread

Ожидалось: Root post + "1 ответ" collapsed block → клик → thread panel с composer
Получено: Root post + отдельное inline-сообщение от evcharge-bot

🟡 BUG-002 (MEDIUM): Дублирование сообщений в Client ChatWidget

Описание: После отправки сообщения клиент видит его дважды в ChatWidget. В DB (mm_order_thread) запись одна — проблема в Flutter state/rendering.

Модуль: Client (ElectroCharge)

Шаги воспроизведения: Открыть order-чат → отправить сообщение → сообщение отображается 2 раза

🔴 BUG-003 (HIGH): Ответ диспетчера не доставляется клиенту

Описание: Следствие BUG-001. Диспетчер отвечает в канале (не в thread), поэтому Bot Service не маршрутизирует ответ клиенту.

Модуль: Dispatcher + Bot Service

Fix: Исправить BUG-001 (ThreadPreview). После этого ответы будут идти через thread composer с root_id → Bot Service доставит клиенту.

Скриншоты (17 шт. — текущий прогон)

00 — Technician app (login screen)
05 — Technician routes list (Ожидает → Принять)
06 — Route accepted: В работе ✅
07 — Client main screen (active orders)
08 — Order PZ-0556: Техник назначен + кнопка Написать ✅
09 — ChatWidget opened (in-app, Чат поддержки) ✅
10 — Message sent ✅ (но дублируется — BUG-002)
11 — Dispatcher (route page, WS cycling)
13 — Route channel: client msg inline from evcharge-bot ❌ BUG-001
14 — Click on root post: no thread panel opened ❌
15 — Dispatcher reply sent to channel (not thread) ⚠️
16 — Client chat: NO dispatcher reply received ❌ BUG-003

Ошибки

DB Checkpoints

CheckpointQueryResult
V0 — Route exists orders + routes + mm_channel_mapping WHERE idClient='2a0b...' ✅ PZ-0556, route PLANNED, channel odeesywc4fd5dg67noig5xia3h
V1 — Status after accept routes + route_points + orders WHERE route_id='4a3947c3...' ✅ route=IN_PROGRESS, order=ASSIGNED
V4-DB — Thread created SELECT * FROM mm_order_thread WHERE order_id='f6dbb424...' ✅ mm_root_post_id=g3o5hrmcajgo7yki1du474fzyc, channel=odeesywc4fd5dg67noig5xia3h
V10 — Final thread check mm_order_thread JOIN mm_channel_mapping ✅ Маппинг корректен: channel=route-20270402-technik-4a39