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

12 KiB
Raw Blame History

SCREEN-008 — Кандидат 0.2.0-rc.1 и общая приёмка

Кандидат собирается без доверенной подписи Windows/macOS и без notarization. Для macOS используется техническая ad-hoc подпись (identity: "-"), без сертификата разработчика и без подтверждения доверия Apple. Это не снимает предупреждения Gatekeeper/SmartScreen. Публикации и автообновления нет.

Сборка и проверка архива

Используются существующие electron-builder и package-lock.json. В CI выбран Node.js 24.15.0; локальную фактическую версию записывает build-info.json. Зависимости устанавливать через npm ci, Electron — существующей командой npx --no-install install-electron --no. Нужен ffmpeg с libx264; выполнить npm run media:generate перед упаковкой. Все тесты и сборки запускать последовательно: команды build/test/smoke пересобирают общий dist-electron.

npm run type-check
npm run lint
npm run lint:css
npm test
npm run smoke
npm run dist -- --linux --win --x64 --arm64 --publish never

Последняя команда — локальная кросс-сборка Linux/Windows. На соответствующей целевой ОС можно собрать один вариант, например:

npm run dist -- --mac --arm64 --publish never
npm run dist -- --win --x64 --publish never
npm run dist -- --linux --arm64 --publish never

Матрица ручного workflow builds.yml: macos-15-intel, macos-15, windows-2025, windows-11-arm, ubuntu-24.04, ubuntu-24.04-arm. Commit/push и запуск workflow выполняет владелец. Workflow загружает только артефакты выполнения, не создаёт GitHub Release. macOS здесь локально не собирается.

Архивы находятся в release/; имена содержат версию, ОС и архитектуру. После упаковки hooks проверяют версию приложения, ELF/PE/Mach-O архитектуру, наличие пульта/preload/синтетических медиа, отсутствие проектных тестов, секретов и посторонних файлов приложения. app.asar включает автоматически упакованные production-зависимости; тестовые скрипты сборки туда не входят.

В resources/build-info.json записаны Git revision, dirty, версии Node/Electron/ electron-builder/ffmpeg, хеш lockfile и SHA-256 app.asar, WAV и MP4. Хеш app.asar покрывает весь упакованный код. После повторного чтения самого архива создаются <archive>.build-info.json и SHA256SUMS-<варианты текущего запуска>. Старые архивы из release/ не подмешиваются. Это сведения о происхождении и целостности, а не цифровая подпись или гарантия побайтового совпадения разных сред сборки.

Повторная проверка явно выбранных архивов:

npm run verify:release -- release/evening-detective-screen-0.2.0-rc.1-linux-x64.tar.gz

В Linux проверить соответствующий SHA256SUMS через sha256sum -c, в macOS — shasum -a 256 -c, в PowerShell — сравнить Get-FileHash -Algorithm SHA256 с нужной строкой manifest. Проверять суммы после передачи файла на целевой компьютер.

Установка и обновление

Платформа Установка
macOS Intel/Apple Silicon Распаковать соответствующий ZIP, перенести .app в Applications.
Windows 11 x64/ARM64 Распаковать весь ZIP в отдельную постоянную папку и запустить EXE.
Ubuntu 24.04 / Debian 13 x64/ARM64 Распаковать tar.gz с сохранением прав и запустить evening-detective-screen. Под Wayland нужен XWayland.

Сначала закрыть старое приложение. Сохранить старый каталог приложения отдельно, распаковать новый в другую папку и запустить его. Не распаковывать поверх работающей копии и не переносить пользовательские файлы в resources/app.asar. Идентификатор, название приложения и формат существующих пакетов не меняются. userData находится отдельно от программы и сохраняется при замене папки приложения.

Ожидаемые стандартные каталоги userData: %APPDATA%/evening-detective-screen в Windows, ~/Library/Application Support/evening-detective-screen в macOS, $XDG_CONFIG_HOME/evening-detective-screen либо ~/.config/evening-detective-screen в Linux. Путь зависит от имени приложения/профиля среды; test/dev могут использовать другое имя. Архивы и журналы не содержат пользовательскую папку. Перед обновлением можно сохранить её копию локально; файл connection/credentials.bin содержит секреты, его не отправлять в отчётах и не переносить на другой компьютер как способ входа.

Если ОС предупреждает о неподписанной сборке, проверить источник и SHA-256, использовать штатную процедуру разрешения запуска согласно политике компьютера. Не отключать Gatekeeper/SmartScreen и защиту ОС глобально. Результат запуска конкретного неподписанного кандидата обязательно записать в таблицу приёмки.

Локальные журналы

userData/logs/diagnostic.jsonl, diagnostic.1.jsonl, diagnostic.2.jsonl: не более трёх файлов по 1 МиБ. Формат — JSON Lines, UTC-время и фиксированные коды событий. Записываются версия/платформа, запуск/выход, открытие/причина закрытия показа, ошибки медиа, смена состояния связи и результат подготовки материалов.

В журнал не передаются сообщения Error.message, URL запросов, токены, пароли, серверные ответы, тексты игры или данные участников. Повторные статусы связи и позиции проигрывателя не пишутся каждую секунду. Если журнал недоступен, показ продолжается; в stderr появляется только код SCREEN_LOG_UNAVAILABLE. Для отчёта достаточно этих файлов и таблицы приёмки; весь userData не прикладывать.

Автоматическая проверка упакованного приложения

npm run smoke:packaged -- release/linux-unpacked/evening-detective-screen

Скрипт запускает настоящий бинарник с отдельным временным userData и тестовыми no-sandbox/mute-audio/disable-gpu и локальным DevTools-портом. Он проверяет интерфейс, preload, локальную выдачу Range, восстановление пакета/результатов/настроек, два перезапуска без автопуска и нормальный выход с журналом. Вторым аргументом можно передать предыдущий бинарник для прогона обновления на том же тестовом профиле. Скрипт не пересобирает dist-electron. В CI этот smoke выполняется на Linux x64 под Xvfb; он не заменяет физический звук, проектор и native fullscreen.

Общий сценарий на каждом стенде

  1. Записать версию/архитектуру сборки, SHA-256, ОС, CPU/RAM, дисплей/переходник, аудиовыход и форматы. Выполнить инструкции SCREEN-001 и SCREEN-004: по 30 запусков каждого проверяемого формата/аудиовыхода, физические медиана/p95; порог ≤150 мс относится только к M1 с 16 ГБ RAM.
  2. Войти, скачать настоящую игру, выбрать её и открыть показ на реальном внешнем дисплее. Проверить восемь режимов, план, текст/кириллицу, таймер, музыку и результаты по SCREEN-005/006.
  3. Отключить сеть на час и пройти полный показ с музыкой, перемоткой, таймером и сменой сцен. Готовые файлы не должны требовать сети; пульт/технические ошибки не должны появляться на проекторе. Записать стабильность и ошибки журнала.
  4. Выполнить SCREEN-007: переподключение проектора, смена параметров дисплея, fullscreen, автоматический/принудительный сон, кабельный/USB/HDMI звук. Восстановление требует явного открытия; медиа остановлены, таймер на паузе.
  5. Вернуть сеть. Старая серверная команда не отменяет локальное действие; новая команда применяется. Завершить игру и сохранить результаты с датой снимка.
  6. Перезапустить приложение без сети: выбранная игра/снимок доступны, окно показа закрыто, звук не начинается. Заменить папку приложения новой сборкой с тем же пользовательским профилем и повторить проверку сохранности данных.
  7. Передать заполненную таблицу результатов и безопасные журналы. Отметить каждый непройденный пункт отдельно. До результатов всех стендов SCREEN-008 остаётся IN_PROGRESS; открытые SCREEN-001/004/007 не объявляются завершёнными.

Шаблон: SCREEN-008_RESULTS.md.