249 lines
29 KiB
Markdown
249 lines
29 KiB
Markdown
# Задачи приложения площадки
|
||
|
||
SCREEN-001, SCREEN-004, SCREEN-007 и SCREEN-008 имеют статус IN_PROGRESS; SCREEN-002, SCREEN-003, SCREEN-005 и SCREEN-006
|
||
завершены и перенесены в архив; остальные активные задачи — TODO.
|
||
SCREEN-009 (LAN-пульт) отменена владельцем; ID не переиспользовать.
|
||
Управление телефоном через сервер входит в SCREEN-006. План и общие ограничения:
|
||
[PLAN.md](PLAN.md). Идентификаторы независимы от ED-* в корневом списке.
|
||
Обновлять статус и результат здесь; завершённые записи переносить в
|
||
`COMPLETED_TASKS.md` в этом каталоге после проверки. Коммиты и push не выполнять.
|
||
|
||
## SCREEN-001 — Проверить основу Electron на macOS, Windows и Linux
|
||
|
||
- Статус: `IN_PROGRESS`
|
||
- Зависимости: нет; первая задача.
|
||
- Цель: подтвердить выбор технологии на всех шести вариантах ОС/архитектуры
|
||
из PLAN.md до переноса функций проекта. Все задачи приложения учитывают эту
|
||
матрицу; Linux проверяется на Ubuntu 24.04 LTS и Debian 13.
|
||
- Объём: минимальный Electron + Vue + TypeScript + Vite; пульт и отдельное окно
|
||
показа; выбор дисплея; синтетические локальные аудио/видео; IPC start/pause/stop
|
||
и seek; безопасный preload и локальная выдача медиа с Range. Подготовить сборки
|
||
для всех шести вариантов, инструкцию получения тестовых медиа и аппаратной
|
||
проверки. Бинарные тестовые файлы не коммитить.
|
||
- Готовность: запуск на всех шести вариантах; пульт остаётся на основном экране,
|
||
показ — на внешнем; звук запускается без ручной разблокировки autoplay;
|
||
pause/seek работают. Зафиксированы ОС, архитектура, CPU/RAM, медиаформаты,
|
||
оборудование и замеры. На M1 с 16 ГБ RAM цель p95 ≤150 мс; на остальных
|
||
компьютерах — медиана/p95 и стабильность без обязательного порога 150 мс.
|
||
- Проверка: type-check, lint, lint:css, build; минимум 30 запусков аудио и видео
|
||
на каждой тестовой конфигурации; отдельно холодный старт, fullscreen, физический
|
||
звук/кадр и отключённая сеть. Проверить кабель/USB и HDMI. Владелец выполняет
|
||
аппаратные проверки по инструкции агента и передаёт результаты.
|
||
- Не входит: сервер, авторизация, скачивание, полный пульт, публикация.
|
||
- Результат программного этапа: Electron + Vue/TypeScript/Vite, два изолированных
|
||
окна, выбор внешнего дисплея, локальный протокол с Range, синтетические
|
||
WAV/H.264+AAC, start/pause/stop/seek, подтверждённые статусы и замеры аудио/видео.
|
||
По уточнению владельца LAN-сервер, сопряжение, мобильный UI и зависимости ws
|
||
удалены. Телефон управляет через сервер сайта; desktop получает обновления
|
||
в SCREEN-006. Полные игровые функции и сервер пока не переносились.
|
||
- Проверка после уточнения: type-check, lint, lint:css, build, 4 теста и GUI smoke —
|
||
PASS. В smoke проверено отсутствие LAN-панели и методов lan/approve в preload,
|
||
локальные play/pause/stop/seek, Range и открытие окна без автоповтора.
|
||
Frontend-стандарт прочитан; ручное ревью diff выполнено, нарушений не найдено.
|
||
- Исправление выбора дисплея: для Linux явно включён X11/XWayland, поскольку native
|
||
Wayland игнорирует глобальные координаты окон. Перед fullscreen повторно заданы
|
||
bounds выбранного дисплея. GUI smoke проверяет размещение и повторное открытие;
|
||
при наличии реального второго дисплея проверяет фактический монитор окна.
|
||
Type-check, lint, lint:css, тесты и GUI smoke — PASS. В текущей среде физически
|
||
подключён только eDP-1; второй дисплей в этом прогоне синтетический, аппаратная
|
||
проверка переноса остаётся открытой. Нужен полный перезапуск приложения.
|
||
Четыре Linux/Windows-архива пересобраны с исправлением; содержимое app.asar
|
||
сверено с текущим кодом, SHA256SUMS обновлён. Нарушений стандарта в diff не найдено.
|
||
- Сборки: Linux/Windows x64/ARM64 пересобраны без LAN; содержимое всех четырёх
|
||
app.asar сверено с проверенным кодом. LAN-модули, ws и тесты отсутствуют в поставке;
|
||
release/SHA256SUMS обновлён. macOS нужно собирать на Mac или ручным workflow.
|
||
- Среда smoke: Manjaro Linux x86_64, Intel Core Ultra 7 255H, около 32 ГБ RAM;
|
||
Node 26.8.1, Electron 42.11.15. Единичные программные замеры не подтверждают
|
||
аппаратную приёмку или физический p95 ≤150 мс. Headless зависал/падал; GUI smoke
|
||
проходил с тестовыми --no-sandbox --mute-audio --disable-gpu.
|
||
- Ограничения исходного стенда: дедупликация хранила последние 4096 команд;
|
||
в программной части SCREEN-004 заменена сессиями и возрастающими номерами. Привязка игры и серверное управление — SCREEN-006.
|
||
- Следующий шаг: получить аппаратные результаты владельца по
|
||
docs/SCREEN-001_ACCEPTANCE.md на всех шести вариантах (Linux — на обоих
|
||
дистрибутивах), включая проектор,
|
||
физический звук/кадр и 30 запусков для каждого формата/аудиовыхода. macOS-сборки
|
||
подготовить на Mac или ручным workflow builds.yml. До результатов всей матрицы
|
||
задача остаётся IN_PROGRESS. Владелец разрешил начать SCREEN-002 до завершения
|
||
аппаратной приёмки; её результаты остаются открытыми.
|
||
|
||
## SCREEN-004 — Локальное воспроизведение и быстрые команды
|
||
|
||
- Статус: `IN_PROGRESS`
|
||
- Зависимость: SCREEN-003 (DONE, см. COMPLETED_TASKS.md); использовать основу
|
||
SCREEN-001. Материалы брать из PackageStore и screen-app://app/packages/<key>/<assetId>.
|
||
- Цель: применять команды пульта независимо от сервера.
|
||
- Объём: локальное состояние в основном процессе; play/pause/resume/stop/replay,
|
||
seek, громкость и mute; плейлист, следующий трек и повтор; подготовка ближайшего
|
||
медиа; подтверждения фактического воспроизведения и понятные ошибки.
|
||
- Готовность: нет ожидания HTTP/опроса; повтор или быстрые последовательности
|
||
команд не создают двойной звук; музыка переходит дальше офлайн; нет загрузки всех
|
||
видео в RAM; политика одновременной музыки и речи соответствует текущему flow.
|
||
- Проверка: тесты переходов и устаревших/повторных команд; проверки приложения;
|
||
ручные seek/replay/смена трека и повтор замеров на всей матрице;
|
||
порог p95 ≤150 мс — на M1.
|
||
- Не входит: стриминг, несколько независимых проигрывателей на разных компьютерах.
|
||
- Программный результат (2026-10-17): готовые пакеты подключены к пульту через
|
||
проверку PackageStore; явный тестовый режим сохранён. Вступление и видео
|
||
взаимно исключаются в основном канале, музыка независима и не приглушается
|
||
автоматически (существующая политика сайта). Начальная громкость 35%, общий
|
||
mute сохраняет уровни. Добавлены play/pause/resume/stop/replay/seek, выбор
|
||
плейлиста/трека, следующий трек и повтор плейлиста. Позиции ограничиваются
|
||
фактической длительностью, пауза и громкость не перематывают ресурс.
|
||
- Согласование: новая сессия при выборе пакета и пересоздании окна, возрастающие
|
||
номера команд без накопления UUID; подтверждения привязаны к операции канала.
|
||
Отменённый play не оживляет канал, быстрый seek→pause не теряет перемотку;
|
||
повторный пуск перезагружает источник после ошибки чтения. Окно открывается
|
||
с остановленными каналами, автоматического возобновления звука нет.
|
||
- Проверки: типы, ESLint, Stylelint, 37 тестов, сборка и GUI smoke Electron — PASS.
|
||
GUI проверил выбор пакета через пульт, локальные WAV/H.264, Range, pause/resume,
|
||
replay/seek, независимую музыку, mute/volume, переход/повтор плейлиста,
|
||
быстрые команды, запреты IPC и повторное открытие без автозапуска.
|
||
Сборки и тесты запускать последовательно: test и smoke пересобирают один
|
||
dist-electron. При параллельной пересборке был таймаут повторного открытия;
|
||
последовательные прогоны прошли.
|
||
- Открыто: аппаратная матрица и физический p95 ≤150 мс на M1; текущие программные
|
||
замеры этого не подтверждают. Проверено на Linux x64, дисплей smoke синтетический,
|
||
звук приглушён тестовым флагом. Реальные игровые файлы и остальные ОС не проверены;
|
||
установочные архивы не пересобирались. Бэкенд и protobuf не менялись.
|
||
- Следующий шаг: выполнить npm run acceptance и аппаратную инструкцию
|
||
docs/SCREEN-004_ACCEPTANCE.md на всей матрице, получить результаты владельца.
|
||
До их получения статус остаётся IN_PROGRESS; перенос в архив не выполняется.
|
||
|
||
## SCREEN-007 — Устойчивость на площадке
|
||
|
||
- Статус: `IN_PROGRESS`
|
||
- Зависимости: SCREEN-005, SCREEN-006 (DONE, см. COMPLETED_TASKS.md).
|
||
- Цель: переживать типовые сбои без потери материалов и случайного показа пульта.
|
||
- Объём: отключение/возврат дисплея, смена разрешения и fullscreen, проверка
|
||
аудиовыхода каждой ОС, предотвращение сна во время показа, восстановление окон и
|
||
выбранного пакета после перезапуска. После сбоя звук самопроизвольно не возобновлять.
|
||
- Готовность: при отключении проектора показ безопасно приостанавливается, пульт
|
||
остаётся доступен; повторный вывод требует явного действия; выбранный пакет
|
||
сохранён, сон не прерывает активный показ, закрытие приложения освобождает блокировку.
|
||
- Проверка: аппаратный smoke на всей матрице с реальным внешним дисплеем,
|
||
переходником и звуком по кабелю/USB и HDMI; тесты восстановления состояния;
|
||
проверки приложения. Результаты аппаратных проверок передаёт владелец.
|
||
- Не входит: бесшовный аварийный резервный компьютер и несколько проекторов.
|
||
- Программный результат (2026-10-17): общий аварийный обработчик отключения/
|
||
превращения дисплея в основной, изменения bounds/scaleFactor/rotation, выхода
|
||
из fullscreen, suspend ОС, падения/зависания renderer и ошибки основного документа.
|
||
Медиа останавливаются, работающий таймер сохраняет точный остаток на паузе;
|
||
возврат дисплея/пробуждение не открывают показ. Обычная кнопка закрытия сохраняет
|
||
прежнюю политику таймера. Изменения только workArea не прерывают показ.
|
||
- Окна и питание: prevent-display-sleep удерживается всё время открытого показа,
|
||
включая статичные сцены/паузу, освобождается при закрытии, сбое и before-quit.
|
||
Native-закрытие завершается до создания нового окна; уничтожение отложено за
|
||
пределы callback native-события, поздние события старого окна отклоняются.
|
||
Пульт восстанавливает проверенные bounds/maximized в рабочей области основного
|
||
дисплея; ID/label внешнего дисплея сохраняются отдельно в windows.json. Выбор
|
||
предзаполняется только при точном совпадении и никогда не открывает показ сам.
|
||
Выбранная игра восстанавливается существующим механизмом SCREEN-006.
|
||
- Изоляция: показ использует отдельную непостоянную Electron session/renderer;
|
||
обе сессии получают одинаковый локальный протокол, CSP и запреты разрешений.
|
||
IPC-привилегии пульта не расширены. В UI добавлены причина закрытия, состояние
|
||
блокировки сна и инструкция проверки системного аудиовыхода/HDMI.
|
||
- Проверки: type-check, ESLint, Stylelint, 68 тестов (5 новых), сборка и GUI smoke —
|
||
PASS. GUI проверяет удаление/возврат дисплея, bounds/scale/rotation, смену primary,
|
||
suspend/resume, fullscreen-события, ошибку документа и зависание окна, сохранение
|
||
настроек, отсутствие автопуска и старой серверной команды после аварии.
|
||
Renderer действительно завершён SIGKILL после проверки отдельного PID; пульт
|
||
сохранил работоспособность, показ открылся заново остановленным. Все 16 созданных
|
||
блокировок освобождены ровно один раз, включая before-quit. git diff --check — PASS.
|
||
- Ограничения стенда: Linux x64, один физический дисплей. В GUI synthetic=true:
|
||
topology/питание и fullscreen-события подставлены, медиа и окна Electron настоящие.
|
||
Native fullscreen используется только с реальным внешним дисплеем; иначе WM
|
||
сам снимал fullscreen синтетического экрана. В раннем прогоне было native-падение
|
||
Electron; исправлен порядок закрытия/повторного открытия. forcefullyCrashRenderer
|
||
зависал до таймаута, поэтому окончательный тест завершает renderer через SIGKILL.
|
||
Использованы тестовые no-sandbox/mute-audio/disable-gpu. Реальное предотвращение
|
||
сна, проектор/аудиовыходы и вся матрица ОС/архитектур пока не проверены.
|
||
Бэкенд, frontend, protobuf и зависимости не менялись; архивы не пересобирались.
|
||
- Следующий шаг: выполнить docs/SCREEN-007_ACCEPTANCE.md на всей матрице с реальным
|
||
проектором, переходником, USB/HDMI и передать аппаратные результаты. До этого
|
||
оставить IN_PROGRESS, не переносить в COMPLETED_TASKS.md. Commit/push не выполнять.
|
||
|
||
## SCREEN-008 — Сборки всех платформ и приёмка
|
||
|
||
- Статус: `IN_PROGRESS`
|
||
- Зависимость: SCREEN-007.
|
||
- Цель: получить устанавливаемую первую версию и подтверждённый сценарий площадки.
|
||
- Объём: воспроизводимые сборки macOS x64/arm64, Windows x64/ARM64 и Linux
|
||
x64/ARM64; инструкции установки/обновления и подготовки игры; решение о подписи
|
||
macOS/notarization по доступности Apple Developer и о подписи Windows по наличию
|
||
сертификата; локальные диагностические логи без секретов. Подписание macOS
|
||
на Mac, секреты вне Git; предупреждения установки без подписи документировать.
|
||
- Готовность: все шесть артефактов запускаются на соответствующих компьютерах,
|
||
Linux — на обоих дистрибутивах из PLAN.md; обновление сохраняет пакеты;
|
||
полный сценарий PLAN.md пройден. Записаны ОС/архитектура/версия приложения,
|
||
медиана/p95, форматы и ограничения; порог задержки применяется только к M1.
|
||
Непройденные проверки явно перечисляются и не позволяют объявить задачу DONE.
|
||
- Проверка: type-check, lint, lint:css, build; установка и полный показ офлайн,
|
||
переподключение проектора, восстановление сети и минимум час работы на каждой
|
||
тестовой конфигурации. Владелец выполняет аппаратную приёмку по инструкции агента.
|
||
- Не входит: публикация в магазинах приложений и автообновления.
|
||
- Программный результат (2026-10-17): кандидат 0.2.0-rc.1 на существующем
|
||
electron-builder; форматы ZIP для macOS/Windows и tar.gz для Linux сохранены.
|
||
Без доверенной подписи/notarization по решению владельца; macOS использует
|
||
техническую ad-hoc подпись. appId и расположение пользовательских данных сохранены.
|
||
- Локально собраны Linux x64/ARM64 и Windows x64/ARM64. После распаковки каждого
|
||
архива проверены архитектура исполняемого файла, состав app.asar и SHA-256 медиа.
|
||
Добавлены build-info с версиями инструментов, Git revision/dirty и хешами,
|
||
sidecar-файлы и SHA256SUMS только для текущих артефактов. Шесть нативных CI jobs
|
||
подготовлены; workflow агент не запускал. Сборки macOS пока отсутствуют.
|
||
- Диагностика: локальные JSONL, максимум три файла по 1 МиБ, фиксированные события
|
||
и разрешённые поля; URL, токены, пароли, данные игр и сырые ошибки не записываются.
|
||
- Проверки: типы, ESLint, Stylelint и 73 теста — PASS. Упакованный Linux x64
|
||
прошёл обновление из 0.1.0 и два перезапуска с сохранением пакета, результатов
|
||
и настроек, без автопуска. Подробности и итоговый GUI smoke:
|
||
docs/SCREEN-008_RESULTS.md. Инструкция: docs/SCREEN-008_ACCEPTANCE.md.
|
||
- Начало аппаратной приёмки Linux: SHA-256 повторно проверены; запущен кандидат
|
||
без тестовых флагов с отдельным профилем. На Manjaro KDE обнаружен только eDP-1;
|
||
ожидается проектор. Зафиксированы три падения GPU-процесса (139), состояние UI
|
||
требует подтверждения владельца. Подробности в docs/SCREEN-008_RESULTS.md;
|
||
аппаратный PASS пока не выставлен.
|
||
- Документация ведущего (2026-10-17): добавлены docs/USER_GUIDE.md и
|
||
docs/EVENT_CHECKLIST.md — установка/обновление, подготовка игры, управление,
|
||
офлайн и восстановление, журналы и чек-лист площадки. README содержит навигацию
|
||
по ролям и однозначный выбор внешнего дисплея. Названия кнопок и поведение
|
||
сверены с текущим UI; относительные ссылки и git diff --check — PASS.
|
||
Код не менялся, новые аппаратные испытания не выполнялись.
|
||
- Согласование интерфейса с сервером и сайтом (2026-10-17): названия режимов
|
||
приведены к сайту («Введение», «Успехов», «Закрывашка», «Спасибо за игру»),
|
||
статусы игр переведены. Рядом с подключением указано имя локальной игры;
|
||
выбор серверной игры для загрузки её не меняет. Добавлено пояснение, что
|
||
отключение управления не удаляет серверную привязку.
|
||
- Назначение звука: OnlineState.soundEnabled (boolean | null) содержит последнее
|
||
подтверждение сервера отдельно от локального mute. До подтверждения неизвестно,
|
||
без опроса помечается как последнее состояние; при новой сессии/отключении
|
||
сбрасывается. Отрицательное значение означает «Экран не назначен для звука»:
|
||
наличие другого назначенного экрана серверный флаг не доказывает.
|
||
- Проверки согласования: type-check, ESLint, Stylelint, 74 теста, сборка и GUI smoke —
|
||
PASS. GUI проверил переведённый статус, независимые выборы игр и статус звука;
|
||
юнит-тест — смену назначения, mute, обрыв связи и сброс сессии. Два ранних
|
||
GUI-прогона остановились на селекторе нового теста; исправлен выбор видимого
|
||
элемента Naive UI, итоговый прогон PASS. Ссылки документации (28) и
|
||
git diff --check — PASS. Руководство и чек-лист обновлены. Архивы кандидата
|
||
не пересобирались; отличие текущих исходников от архивов явно описано в README.
|
||
Бэкенд, сайт, protobuf и зависимости не менялись.
|
||
- Ревизия SCREEN-005/006 (2026-10-17): исправлены назначение звука после обрыва,
|
||
сброс прокрутки неизменной таблицы и пропуск перестановки треков. 77 тестов,
|
||
типы, линтеры, сборка, GUI smoke и проверка diff/стандарта — PASS; подробности
|
||
в COMPLETED_TASKS.md. Архивы не пересобирались; аппаратная приёмка остаётся открытой.
|
||
- Исправление запуска SCREEN-001/008 (2026-10-17): воспроизведён SIGSEGV
|
||
GPU-процесса в ANGLE/EGL на Manjaro KDE Wayland/XWayland. Для Wayland-сессий
|
||
Linux отключена только GPU-композиция окон. Обычный запуск исходников с чистым
|
||
профилем подтверждён отрисованным пультом без падений GPU. 77 тестов, типы,
|
||
линтеры и GUI smoke без no-sandbox/disable-gpu — PASS. Linux x64 пересобран;
|
||
подробности в docs/SCREEN-008_RESULTS.md. Аппаратная приёмка остаётся открытой.
|
||
- Уточнение SCREEN-001/008 (2026-10-18): предыдущая проверка снимком страницы
|
||
не подтверждала native-видимость окна. Причина — выбор X11 через appendSwitch
|
||
после выбора Wayland в Electron. npm-команды теперь используют ранний X11;
|
||
обычный Linux-запуск перезапускается с ним до создания окон. Прежнее отключение
|
||
GPU-композиции удалено. Проверены native XID и регистрация окна в KWin; 77 тестов,
|
||
типы, линтеры и GUI smoke — PASS. Аппаратная приёмка остаётся открытой.
|
||
- Открыто: получить macOS x64/arm64 через workflow после commit/push владельцем;
|
||
выполнить аппаратную матрицу, включая оба Linux-дистрибутива, час офлайн,
|
||
проектор/звук/телефон и физические замеры на M1. Статус IN_PROGRESS до получения
|
||
результатов всех стендов. SCREEN-001/004/007 также не закрываются.
|
||
Бэкенд, сайт, protobuf и зависимости не менялись; commit/push не выполнялись.
|