Files
evening_detective_screen/docs/SCREEN-001_ACCEPTANCE.md
T
2026-10-18 01:47:42 +07:00

137 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SCREEN-001 — сборки и аппаратная проверка
Статус: аппаратная приёмка открыта. Сборка не доказывает звук, первый кадр,
совместимость с проектором или выполнение порога задержки.
Историческая инструкция технического стенда 0.1.0. Текущий кандидат 0.2.0-rc.1:
[SCREEN-008_ACCEPTANCE.md](SCREEN-008_ACCEPTANCE.md),
[результаты](SCREEN-008_RESULTS.md). Аппаратные требования SCREEN-001 сохраняются.
## Сборки
На каждой целевой ОС установите Node.js 24.15+ и ffmpeg с libx264, выполните команды
запуска из README. Зависимости зафиксированы package-lock.json; используйте npm ci.
Electron загружается отдельной командой install-electron. Генерация медиа обязательна
до упаковки. Пакеты без доверенной подписи/notarization, публикации и автообновления нет.
| Среда сборки | Команда после подготовки | Артефакт |
| --- | --- | --- |
| macOS Intel | npm run dist -- --mac --x64 | release/*.zip |
| macOS Apple Silicon | npm run dist -- --mac --arm64 | release/*.zip |
| Windows x64 | npm run dist -- --win --x64 | release/*.zip |
| Windows ARM64 | npm run dist -- --win --arm64 | release/*.zip |
| Linux x64 | npm run dist -- --linux --x64 | release/*.tar.gz |
| Linux ARM64 | npm run dist -- --linux --arm64 | release/*.tar.gz |
В Linux приложение явно использует X11, в сессии Wayland — через XWayland.
Нативный Wayland не позволяет надёжно задавать глобальные координаты окна:
[ограничение Electron](https://www.electronjs.org/docs/latest/api/browser-window#platform-notices).
Перед fullscreen окно явно размещается в границах выбранного дисплея.
Сборки macOS выполняйте на Mac. На Windows ARM используйте ARM-версию Node.js.
Linux tar.gz распаковать с сохранением прав файлов; запуск — исполняемый файл
в распакованном каталоге. Архивы Windows распаковать целиком, macOS .app перенести в Applications.
Gatekeeper и SmartScreen могут предупреждать о неподписанном приложении; следуйте
политике своего компьютера, не отключайте защиту ОС глобально.
Ручной GitHub Actions workflow builds.yml подготавливает шесть вариантов на
соответствующих runners и публикует только workflow-артефакты. Агент workflow
не запускает, не коммитит и не отправляет в remote. Labels runners сверены с
[документацией GitHub](https://docs.github.com/en/actions/reference/runners/github-hosted-runners).
CI не заменяет проверку macOS 13, Windows 11 и обоих дистрибутивов Linux.
Windows-стенд собирается с signAndEditExecutable=false: без редактирования
иконки/метаданных EXE и без подписи. В SCREEN-008 сохранена эта настройка; доверенная подпись не используется.
В workflow выбран ELECTRON_BUILDER_COMPRESSION_LEVEL=1 для быстрой упаковки.
Локально при необходимости задайте ту же переменную окружения перед командой
сборки (bash: export ELECTRON_BUILDER_COMPRESSION_LEVEL=1; PowerShell:
$env:ELECTRON_BUILDER_COMPRESSION_LEVEL='1'). Она меняет степень сжатия архива,
содержимое приложения остаётся тем же.
Имена архивов включают ОС и архитектуру; release/ и тестовые медиа игнорируются Git.
## Актуальность сборок
После удаления лишней сетевой инфраструктуры архивы Linux/Windows x64/ARM64 пересобраны из текущего
кода. Содержимое app.asar сверено: LAN-модулей, ws и тестов в поставке нет.
Контрольные суммы обновлены в release/SHA256SUMS. Type-check, lint, lint:css,
build, 4 теста и GUI smoke — PASS, включая запуск кнопкой локального пульта.
Сборки macOS и workflow пока не выполнялись; аппаратная приёмка остаётся открытой.
## Автоматический smoke
После генерации медиа выполните npm run smoke в графической сессии. Проверка
использует реальный второй дисплей при наличии, иначе синтетический: IPC, Range,
запуск/пауза/стоп/seek, запрет IPC из окна показа и отсутствие автоповтора.
Проверяются координаты выбранного дисплея перед fullscreen и при повторном открытии;
в Linux — режим X11. При реальном втором дисплее дополнительно проверяется,
на каком мониторе фактически оказалось полноэкранное окно. Дополнительно
проверяется отсутствие LAN-методов в preload и сетевых параметров в данных пульта.
Это не проверка реального проектора. Серверное управление проверяется в SCREEN-006.
В ограниченной среде агента запуск выполнен с тестовыми флагами --no-sandbox
--mute-audio --disable-gpu. В обычном запуске npm run dev этих флагов нет.
Headless-запуск в данной среде зависал/завершался SIGSEGV; GUI smoke прошёл.
## Тестовые файлы
npm run media:generate использует ffmpeg:
- audio.wav: 60 с, PCM s16le, mono, 48 кГц, синус 1000 Гц с фильтром volume=0.1.
- video.mp4: 60 с, H.264/libx264, yuv420p, 1280×720, 30 fps; AAC mono 48 кГц,
синус 1000 Гц с фильтром volume=0.1; faststart.
Окно показа устанавливает громкость элемента 35%. Начинайте с умеренной системной
громкости. Фиксируйте ffmpeg -version, размеры и SHA-256 фактических файлов:
битовый результат зависит от версии кодировщика.
## Сценарий
1. До запуска назначить экран компьютера основным в настройках ОС. Записать ОС/версию, архитектуру, CPU/RAM, версию приложения/Electron, размеры
медиа, дисплей, разрешение, масштаб, переходник, тип кабеля и аудиовыход.
2. Включить расширенный рабочий стол, выбрать внешний дисплей, открыть показ.
Проверить, что пульт и технические сообщения не видны игрокам. На macOS проверить
fullscreen/Spaces и перемещение фокуса между пультом и показом.
3. После холодного старта запустить аудио без клика в окне показа. Повторить для видео.
Проверить физический звук/изображение и отсутствие дублирования звука в пульте.
4. Для каждого формата выполнить минимум 30 запусков подготовленного медиа отдельно
для кабеля/USB и HDMI. Записать медиану/p95 из пульта для выбранного формата.
Холодный старт учитывать отдельно. Замеры последних 400 запусков хранятся в RAM
и разделены по формату. После перезапуска они сбрасываются.
5. Проверить pause/stop и seek на 10, 30, 59 с как во время воспроизведения, так и
на паузе. Несколько раз быстро чередовать аудио/видео, пуск/паузу/стоп:
звук не должен дублироваться; итоговый статус соответствует проигрывателю.
6. Отключить интернет; локальное воспроизведение и пульт остаются работоспособными.
7. Отключить дисплей: окно показа закрывается, пульт остаётся доступен. Подключить
снова, открыть показ явно: старое воспроизведение не должно возобновиться.
Сценарий выполнить для macOS x64/ARM64 и Windows 11 x64/ARM64; для Linux x64/ARM64
проверить Ubuntu 24.04 LTS и Debian 13. Bluetooth в матрицу не входит.
## Физическая задержка
Числа в UI измеряют только приём команды основным процессом → завершение play(),
а не нажатие → звук/кадр. Для физического измерения снимите пульт и фактический
проектор камерой не менее 240 fps со звуком, отмечая момент нажатия и начало
тестового сигнала/движения изображения (не уже подготовленного неподвижного кадра). Запишите метод, частоту съёмки и погрешность; при
неоднозначном моменте нажатия используйте внешний регистратор кнопки/звука/кадра.
Для 30 отсортированных значений медиана — среднее 15-го и 16-го, p95 — 29-е.
На M1 16 ГБ целевой p95 от нажатия пульта компьютера до физического вывода ≤150 мс.
На остальных конфигурациях фиксируем медиану/p95 и стабильность без этого порога.
## Протокол результата
Для каждой конфигурации приложить:
- дата; ОС/архитектура; CPU/RAM; версия приложения/Electron;
- дисплей/переходник/разрешение; аудиовыход; версии ffmpeg и параметры файлов;
- холодный старт; 30 исходных значений каждого формата/выхода; медиана/p95;
- отдельно программная и физическая задержка, способ измерения и погрешность;
- результаты pause/seek/fullscreen/offline/переподключения дисплея;
- ошибки, ограничения и итог PASS/FAIL.
Пока не пройдена вся матрица и не получены физические измерения M1, SCREEN-001
остаётся IN_PROGRESS, SCREEN-002 не начинается. Результаты владельца фиксируются
в TASKS.md; неподтверждённые пункты не объявляются успешными.