Files
evening_detective_screen/docs/SCREEN-001_ACCEPTANCE.md
T
2026-10-17 21:21:03 +07:00

12 KiB
Raw Blame History

SCREEN-001 — сборки и аппаратная проверка

Статус: аппаратная приёмка открыта. Сборка не доказывает звук, первый кадр, совместимость с проектором или выполнение порога задержки.

Историческая инструкция технического стенда 0.1.0. Текущий кандидат 0.2.0-rc.1: SCREEN-008_ACCEPTANCE.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. Перед 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. 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.

Актуальность сборок

После удаления LAN-пульта архивы 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; неподтверждённые пункты не объявляются успешными.