# SCREEN-007 — Аппаратная проверка устойчивости Статус задачи остаётся IN_PROGRESS, пока нет результатов всей аппаратной матрицы. Автоматический smoke подставляет события дисплея/питания и при синтетическом мониторе также fullscreen. Native fullscreen остаётся для реального внешнего дисплея. Renderer действительно завершается SIGKILL в отдельном процессе: он проверяет обработчики, но не физические кабели, звук и предотвращение сна ОС. ## Стенд Проверить macOS 13+ Intel/Apple Silicon, Windows 11 x64/ARM64, Linux x64/ARM64 на Ubuntu 24.04 LTS и Debian 13. На Linux под Wayland требуется XWayland. Использовать реальный внешний дисплей в режиме расширенного рабочего стола, проектные файлы WAV/MP3/OGG и H.264/AAC, проверяемые переходники и аудиоустройства. 1. Выполнить `npm ci`, `npm run media:generate`, `npm run dev` в каталоге screen. 2. Подготовить и выбрать игру по SCREEN-006_ACCEPTANCE.md; затем отключить сеть для локальных проверок. Для синтетического WAV/видео доступен тестовый режим. 3. Пульт разместить на основном дисплее компьютера, показ открыть на внешнем. Проверить сообщение «Автоматический сон заблокирован на время показа». 4. Перед каждым аварийным сценарием запустить медиа и таймер на несколько минут. Для одновременной проверки обоих каналов включить музыку и вступление/видео. Не использовать тестовый --mute-audio. Записать остальные флаги запуска. ## Дисплей и окно показа - Отключить кабель проектора. Окно показа должно закрыться, оба канала остановиться, работающий таймер — остаться на паузе с сохранённым остатком. В пульте видна причина, блокировка сна выключена, сам пульт доступен на основном экране. - Вернуть кабель. Показ не открывается и звук не запускается. Открыть показ вручную: медиа остановлены, таймер на паузе. Отдельно продолжить таймер и медиа. - Повторить со сменой разрешения, масштаба и ориентации выбранного внешнего дисплея. Показ закрывается по той же политике; продолжение только вручную. - Сделать выбранный дисплей основным средствами ОС: показ закрывается, пульт остаётся доступен в рабочей области нового основного дисплея. Вернуть основной дисплей компьютера и заново выбрать внешний. - Выйти из fullscreen средствами ОС/Esc, если ОС это поддерживает. Показ закрывается с аварийной паузой таймера. Простая потеря фокуса при работе с пультом не должна закрывать показ. - Нажать обычную кнопку «Закрыть показ»: медиа останавливаются, но уже работающий таймер продолжает отсчёт — это прежняя политика явного закрытия. - Если окно показа зависло, потеряло основной документ или его renderer упал, оно закрывается, таймер ставится на паузу. Пульт должен оставаться доступен; повторный показ открывается вручную. Программный smoke проверяет эти события, включая настоящее принудительное завершение renderer; вызывать сбой драйвера или ОС вручную не требуется. ## Сон и звук - Временно задать короткое время автоматического выключения дисплея/сна в ОС. Проверить, что при открытом показе компьютер и дисплей остаются активны дольше этого интервала: во время воспроизведения, на паузе и на статичной обложке. После закрытия показа/приложения прежний автоматический сон должен работать. Вернуть исходные настройки питания после проверки. - Принудительно отправить компьютер в сон, затем разбудить. Блокировка приложения не отменяет принудительный сон и закрытие крышки. После пробуждения пульт доступен, показ закрыт, звук сам не начинается, работающий таймер на паузе. - Перед игрой выбрать выход ОС: macOS — настройки звука, «Выход»; Windows — «Система → Звук»; Linux — настройки звука рабочего окружения. Проверить громкость, mute и пробный пуск. Повторить с кабельным/USB-выходом и HDMI. - После подключения/возврата HDMI проверить выбранный выход повторно: ОС может автоматически переключить звук на проектор. Приложение не выбирает устройство и не маршрутизирует звук на несколько выходов. ## Восстановление и сервер 1. Изменить размер/положение пульта, развернуть его, выбрать внешний дисплей и игру. Закрыть приложение и снова запустить `npm run dev` с тем же профилем ОС. Пульт восстанавливает размер/развёрнутое состояние в рабочей области основного дисплея. Готовая игра доступна офлайн, показ закрыт, звук и таймер не запущены. 2. Повторить перезапуск с отключённым проектором и уменьшенным разрешением основного дисплея. Пульт должен полностью помещаться в доступную область. Внешний дисплей предвыбирается только при совпадении сохранённых ID и названия; другой экран требуется выбрать вручную. Автоматического открытия нет. 3. Вернуть сеть и подключить управление игрой. После аварийного закрытия отправить через сайт команду PLAY, затем восстановить и вручную открыть показ. Накопленная команда не запускает звук. Следующая новая команда применяется. 4. Закрыть приложение во время показа. Звук прекращается, блокировка сна освобождается, материалы остаются на диске. При повторном запуске нет автопуска. Выбранная игра сохраняется механизмом SCREEN-006, настройки окон — в отдельном `windows.json` внутри userData. Повреждённые настройки окон заменяются безопасным расположением и сообщением в пульте; пакеты и секреты при этом не удаляются. ## Отчёт Для каждого стенда записать ОС/архитектуру, CPU/RAM, версию приложения/Electron, режим рабочего стола (для Linux — X11 или XWayland), дисплей, кабель/переходник, аудиовыход, форматы, результаты каждого пункта и наблюдаемые сбои. Не передавать пароли, токены и файлы секретов. Аппаратные задержки пуска относятся к SCREEN-001/SCREEN-004; эта проверка не подтверждает p95 ≤150 мс на M1.