Files
evening_detective_screen/TASKS.md
T
2026-10-18 13:01:44 +07:00

255 lines
30 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, SCREEN-004, SCREEN-007 и SCREEN-008 имеют статус IN_PROGRESS; SCREEN-002, SCREEN-003, SCREEN-005 и SCREEN-006
завершены и перенесены в архив; остальные активные задачи — TODO.
SCREEN-009 отменена владельцем; 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, подтверждённые статусы и замеры аудио/видео.
По уточнению владельца лишняя сетевая инфраструктура и зависимости ws
удалены. Получение обновлений от сервера реализовано в 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 не выполнялись.
## SCREEN-024 — Сетевой стек Electron для API и материалов
- Статус: `IN_PROGRESS`.
- Причина: сайт авторизуется, приложение получает UND_ERR_CONNECT_TIMEOUT; API и файлы приложения используют Node fetch, обходящий браузерный сетевой стек и системный прокси Chromium.
- Изменение: внедрить net.fetch Electron в существующие Online и PackageStore без смены API/адресов/таймаутов; сохранить безопасные ошибки сети.
- Проверка: тесты, type-check, lint, lint:css, build, Electron smoke с HTTP-прокси и неразрешимым доменом.