WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-349 · Дефект · — · web

P3 [голос, косметика]: мигает «Cancellation failed: no active response found» при перебивании, когда озвучивать нечего

Закрыт P3 ведёт: —
Суть
# Репро (owner 24.08, живой голос)
Во время разговора иногда на секунду всплывает баннер Realtime Voice Settings: «Cancellation failed: no active response found», затем пропадает. Разговор НЕ рвётся (слушает/отвечает/говорит дальше).

# Причина (гипотеза)
Клиент шлёт response.cancel, когда активного response уже нет (гонка: пользователь перебил после того как ответ уже завершился/не начался). Сервер/драйвер возвращает ошибку, а UI показывает её как красный баннер вместо тихого игнора.

# Что сделать
- Не показывать пользователю ошибку отмены, когда нет активного response (это норма при перебивании) — глушить/логировать debug, не баннер.
- Либо не слать cancel, если известно что активного response нет.
Файл-кандидат: src/hooks/useRealtime.ts (обработка response.cancel/ошибок), openaiWebRtcDriver. Родня: WEB-316 (голос работает), WEB-348 (экономика голоса).
Доказательства
[25.08 ~13:40] Волна web349 (sol xhigh, A1, wt-web349 от c3fb44e): двухслойный фикс гонки cancel (не слать без active response + debug-лог вместо баннера ТОЛЬКО для этой ошибки), unit на гонку + контрольный на реальную ошибку. Платный realtime не гоняется.

[25.08 ~14:50] СДЕЛАНО волной web349: commit f28883b (wt-web349 от c3fb44e). Корень подтверждён с точными файл:строками (useRealtime.ts:2801→driver:185→onEvent→patchRealtimeState→ChatInterface баннер). Фикс двухслойный: (1) драйвер трекает pending/active response — cancel в никуда НЕ отправляется; (2) точный классификатор только для «no active response found» → debug event response_cancel_race_ignored, БЕЗ error-стейта; ЛЮБАЯ другая ошибка — прежний путь с баннером (контрольный тест). Тесты 6/6 (idle-cancel/active-cancel/race/other-error), eslint+tsc rc=0. Живой realtime не гонялся. → review; в батч посадки 54.

[25.08 ~15:00Z] В ПРОДЕ посадкой 54: релиз arm64-l59-20260825T134818Z, v4-2857a88 (merge-батч 2857a88, все проверки зелёные, Gate D сохранён ON). Живая проверка: перебивание голоса не должно мигать баннером.

📎 Трейл: отчёт /home/ubuntu/waves/WEB349-REPORT.md; ветка web349@f28883b (в проде 54, merge cf6e5e1). Тесты: tests/unit/realtime-use-realtime.test.tsx (WEB-349 секция).
[2026-08-26 07:35Z] Автор web349: no-active-response race при перебивании больше не создаёт баннер (только debug-log); idle cancel не уходит в data channel, active cancel уходит; ЛЮБАЯ другая cancel-ошибка сохраняет прежний путь (console.warn + patchRealtimeState + видимый баннер) — проверено контрольным тестом; 4 условия в unit-тесте; scoped tsc rc=0. -> review (acc349: узость фильтра, гонки, двойное перебивание).
[2026-08-26 07:48Z] ✅ ПРИНЯТ acc349: GO — no-active-response race при перебивании больше не даёт баннер (только debug-log), фильтр УЗКИЙ (реальные ошибки отмены показываются), idle/active cancel ведут себя корректно, гонки и двойное перебивание проверены. -> done, ждёт посадки 58.
Починено в
pending-l58
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-349","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-26T07:48:34.992Z