Пункты 3, 10 и 11 матрицы и тест саундборда падали не на продукте, а на
инфраструктуре: ICE через TURN на VPS не поднимается (STUN отвечает, но все
ICE-пары `failed` с `requestsReceived: 0`), и проверка трижды ждала кнопку
входа, после чего падал весь прогон.
В support.ts добавлен общий помощник joinVoiceIfPossible/joinVoiceOrSkip:
- три попытки, как раньше, но при уже показанной клиентом ошибке повтор не
делается, а ожидание ограничено 25 секундами;
- при неудаче проверяется серверная часть входа (POST .../voice/join →
токен LiveKit): живой сервер при мёртвом ICE — блокер среды, проверка
скипается с точной причиной; нерабочая ручка — дефект продукта, тест
падает. Проба ограничена по времени, а ответ 429 считается признаком
живого сервера (лимит частоты к медиапути отношения не имеет);
- п. 11 при недоступном голосе не отменяется: голосовой мьют пропускается
с аннотацией и предупреждением в лог, а тайм-аут, кик, возврат сервера в
рейку и бан по-прежнему проверяются.
Три локальные копии joinVoice заменены одним помощником.
Прогоны на стенде (образ с HEAD): матрица 18 passed / 0 failed / 3 skipped,
§11.5 — 8 passed, два прогона подряд совпали; без правки было 3 failed.
Проверки, которые в матрице 11.6 обходились по REST, теперь идут через
интерфейс (AGENT.md 7.13, 7.15, 11.6).
- 25: 🔗/⚙/+ видны владельцу и не видны обычному участнику, а после выдачи
роли с правами управления появляются без перезагрузки;
- 26: статус комнаты и медленный режим появляются в шапке по событию и
пропадают при снятии;
- 27: саундборд — панель открывается в голосовой комнате, проигрывание
уходит на сервер (200), звук играет локально (счётчик вызовов
`Audio.play`, подпись «включил звук»). Если медиапуть LiveKit не
поднялся, тест скипается с причиной: это внешняя зависимость;
- 28: счётчик непрочитанных в сайдбаре и явная фиксация того, что центра
уведомлений в клиенте нет (заглушка — только переключатель системных
уведомлений в настройках).