Files
evening_detective_screen/TASKS.md
T
2026-10-17 18:14:31 +07:00

215 lines
23 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 имеет статус IN_PROGRESS; остальные задачи — TODO. План и общие ограничения:
[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; техническое
подключение браузера телефона по LAN с сопряжением и отправкой команды. Подготовить сборки
для всех шести вариантов, инструкцию получения тестовых медиа и аппаратной
проверки. Бинарные тестовые файлы не коммитить.
- Готовность: запуск на всех шести вариантах; пульт остаётся на основном экране,
показ — на внешнем; звук запускается без ручной разблокировки autoplay;
pause/seek работают. Зафиксированы ОС, архитектура, CPU/RAM, медиаформаты,
оборудование и замеры. На M1 с 16 ГБ RAM цель p95 ≤150 мс; на остальных
компьютерах — медиана/p95 и стабильность без обязательного порога 150 мс.
- Проверка: type-check, lint, lint:css, build; минимум 30 запусков аудио и видео
на каждой тестовой конфигурации; отдельно холодный старт, fullscreen, физический
звук/кадр и отключённая сеть. Проверить кабель/USB и HDMI. Владелец выполняет
аппаратные проверки по инструкции агента и передаёт результаты.
- Не входит: сервер, авторизация, скачивание, полный пульт, публикация.
- Результат программного этапа (17.10.2026): Electron + Vue/TypeScript/Vite,
два изолированных окна, выбор внешнего дисплея, локальный протокол с Range,
синтетические WAV/H.264+AAC, start/pause/stop/seek, подтверждённые статусы и
отдельные замеры аудио/видео и компьютера/телефона. LAN включается явно:
код + подтверждение на компьютере, HttpOnly-сеанс, отзыв при отключении.
Полные игровые функции и сервер не переносились.
Подготовлены четыре финальных архива Linux/Windows x64/ARM64 в release/ и
SHA256SUMS; содержимое app.asar всех четырёх сверено с проверенным кодом,
медиа присутствуют, тестовые модули исключены из поставки. Linux x64-бинарник
отдельно запускается из упакованного каталога; UI/preload и Range — PASS.
macOS x64/ARM64 не собраны здесь: нужны Mac или подготовленный ручной CI workflow.
- Проверка: frontend-стандарт прочитан; ручное ревью нового кода выполнено,
используются Naive UI, типизированный IPC, scoped CSS и палитра проекта.
type-check, lint, lint:css, build и 5 тестов — PASS. GUI smoke — PASS:
фактический запуск/пауза/стоп/seek медиа, Range 206/100 байт, запрет IPC из окна
показа, сопряжение через браузерный UI, оба пульта, отзыв и открытие окна без
автоповтора. Это синтетический дисплей и браузер Electron, не проектор/телефон.
Проверено, что превышение лимита WebSocket закрывает соединение, не сервер.
В sandbox LAN-тесту недоступен bind; PASS получен вне sandbox с временным портом.
Headless в этой среде зависал/завершался SIGSEGV; GUI прошёл с тестовыми
--no-sandbox --mute-audio --disable-gpu. В обычном запуске этих флагов нет.
- Среда smoke: Manjaro Linux x86_64, Intel Core Ultra 7 255H, около 32 ГБ RAM;
Node 26.8.1, Electron 42.11.15. Программные единичные замеры не считаются
аппаратной приёмкой или подтверждением p95 ≤150 мс.
- Ограничения: npm audit --omit=dev — 0 уязвимостей; полный audit — 20 в цепочках
инструментов разработки (8 moderate, 12 high). Дедупликация стенда хранит последние
4096 команд; долговременная семантика — SCREEN-004. HTTP только в доверенной сети.
- Следующий шаг: получить аппаратные результаты владельца по
docs/SCREEN-001_ACCEPTANCE.md на всех шести вариантах (Linux — на обоих
дистрибутивах), включая реальные iPhone/Safari и Android/Chrome, проектор,
физический звук/кадр и 30 запусков для каждого формата/аудиовыхода. macOS-сборки
подготовить на Mac или ручным workflow builds.yml. До результатов всей матрицы
задача остаётся IN_PROGRESS, SCREEN-002 не начинается.
## SCREEN-002 — Выдать версионированный пакет показа
- Статус: `TODO`
- Зависимость: SCREEN-001 подтверждён на всей матрице платформ.
- Репозитории: screen, server; frontend только при изменениях общего protobuf.
- Цель: получить полный список данных и файлов для подготовки конкретной игры.
- Объём: изучить доступ организатора, план, обложки, фон, вступление, видео,
плейлисты и вложенные ресурсы; использовать текущие RPC, добавить недостающий
манифест с версией, размерами, контрольными суммами и авторизованной загрузкой.
- Готовность: все ресурсы показа перечислены; изменение файла меняет версию;
отсутствие обязательного ресурса обнаруживается; чужую игру скачать нельзя;
существующие клиенты продолжают работать. Токены не входят в снимок пакета.
- Проверка: тесты полноты, версий и отказа в доступе; `go test ./...`; штатная
генерация protobuf и проверки frontend при затрагивании контракта.
- Не входит: локальная копия всей серверной БД и материалов вне показа.
- Следующий шаг: проследить callers RPC экранов и доступ к файлам, описать
минимальный контракт пакета и только затем менять API.
## SCREEN-003 — Скачивать и проверять материалы на диске
- Статус: `TODO`
- Зависимость: SCREEN-002.
- Цель: гарантировать полноту локального пакета до начала игры.
- Объём: прогресс и отмена загрузки, проверка свободного места, временные файлы,
SHA-256/размер, повтор после обрыва, атомарная активация, явное удаление пакета.
Незавершённые файлы никогда не выдавать как готовые.
- Готовность: все материалы читаются без сети; повреждённый или неполный пакет
не получает статус готовности; неудачное обновление сохраняет предыдущую версию;
перезапуск сохраняет готовность; удаление не затрагивает файлы вне хранилища.
- Проверка: тесты повреждения, нехватки места, обрыва/повтора, путей и обновления;
штатные проверки приложения; ручной запуск скачанного пакета без сети.
- Не входит: фоновое автообновление активного пакета и неограниченный кэш.
- Следующий шаг: определить формат каталога и манифеста, реализовать одну полную
загрузку с проверкой и затем обработать сбои.
## SCREEN-004 — Локальное воспроизведение и быстрые команды
- Статус: `TODO`
- Зависимость: SCREEN-003; использовать основу SCREEN-001.
- Цель: применять команды пульта независимо от сервера.
- Объём: локальное состояние в основном процессе; play/pause/resume/stop/replay,
seek, громкость и mute; плейлист, следующий трек и повтор; подготовка ближайшего
медиа; подтверждения фактического воспроизведения и понятные ошибки.
- Готовность: нет ожидания HTTP/опроса; повтор или быстрые последовательности
команд не создают двойной звук; музыка переходит дальше офлайн; нет загрузки всех
видео в RAM; политика одновременной музыки и речи соответствует текущему flow.
- Проверка: тесты переходов и устаревших/повторных команд; проверки приложения;
ручные seek/replay/смена трека и повтор замеров на всей матрице;
порог p95 ≤150 мс — на M1.
- Не входит: стриминг, несколько независимых проигрывателей на разных компьютерах.
- Следующий шаг: сверить существующую семантику ScreenCommand/MusicState и
реализовать один последовательный путь команда → проигрыватель → подтверждение.
## SCREEN-005 — Пульт ведущего и все режимы показа
- Статус: `TODO`
- Зависимость: SCREEN-004.
- Цель: провести показ выбранной игры с ноутбука без телефона.
- Объём: выбор подготовленного пакета, план шагов, предпросмотр без второго звука,
обложка, фон, вступление, закрывающее видео, текст, таймер, результаты и музыка;
фактические статусы загрузки, подготовки и воспроизведения на пульте.
- Готовность: все текущие режимы ScreenMode доступны; таймер работает локально
без накопления дрейфа от интервалов; пульт и технические сообщения не попадают
на проектор; неготовый файл нельзя ошибочно запустить как готовый.
- Проверка: проверки приложения и ручной проход полного плана без интернета;
предпросмотр не дублирует звук; кириллица, шрифты и изображения доступны офлайн.
- Не входит: редактор сценариев и полное управление командами/регистрациями игры.
- Следующий шаг: сопоставить текущие компоненты и callers с экраном пульта;
переиспользовать подходящее без преждевременного общего пакета.
## SCREEN-006 — Подключение игры и синхронизация с сервером
- Статус: `TODO`
- Зависимости: SCREEN-002, SCREEN-005.
- Цель: выбирать доступную организатору игру онлайн и сохранять автономность показа.
- Объём: существующая авторизация, список игр, загрузка пакета, снимок результатов,
индикатор связи, проверка новой версии материалов, синхронизация статуса показа.
Уточнить минимальный серверный контракт по фактической реализации.
- Готовность: готовая игра открывается после перезапуска офлайн; секреты хранятся
средствами ОС, не в пакете; истечение сессии не обрывает уже подготовленный
локальный показ; обновления активируются явно. Результаты имеют время снимка.
Возврат сети не повторяет старые команды; серверные команды не перехватывают desktop-показ.
- Проверка: сценарии offline/reconnect/истёкшей сессии/обновления игры; проверки
затронутых репозиториев; существующий браузерный экран продолжает работать.
- Не входит: полноценная офлайн-игра и управление desktop через интернет.
Телефон по LAN реализуется в SCREEN-009; сайт не перехватывает локальное управление.
- Следующий шаг: сверить auth flow и модель сессий; зафиксировать правила
локального владения показом и отображения статуса на сервере.
## SCREEN-007 — Устойчивость на площадке
- Статус: `TODO`
- Зависимости: SCREEN-005, SCREEN-006, SCREEN-009.
- Цель: переживать типовые сбои без потери материалов и случайного показа пульта.
- Объём: отключение/возврат дисплея, смена разрешения и fullscreen, проверка
аудиовыхода каждой ОС, предотвращение сна во время показа, восстановление окон и
выбранного пакета после перезапуска. После сбоя звук самопроизвольно не возобновлять.
- Готовность: при отключении проектора показ безопасно приостанавливается, пульт
остаётся доступен; повторный вывод требует явного действия; выбранный пакет
сохранён, сон не прерывает активный показ, закрытие приложения освобождает блокировку.
- Проверка: аппаратный smoke на всей матрице с реальным внешним дисплеем,
переходником и звуком по кабелю/USB и HDMI; тесты восстановления состояния;
проверки приложения. Результаты аппаратных проверок передаёт владелец.
- Не входит: бесшовный аварийный резервный компьютер и несколько проекторов.
- Следующий шаг: проверить события Electron display/window и определить
минимальную безопасную реакцию на отключение внешнего экрана.
## SCREEN-008 — Сборки всех платформ и приёмка
- Статус: `TODO`
- Зависимость: 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; установка и полный показ офлайн,
переподключение проектора, восстановление сети и минимум час работы на каждой
тестовой конфигурации. Владелец выполняет аппаратную приёмку по инструкции агента.
- Не входит: публикация в магазинах приложений и автообновления.
- Следующий шаг: выбрать минимальный инструмент упаковки для всей матрицы,
проверить среду сборки и наличие сертификатов, собрать артефакты и подготовить
инструкции для аппаратной приёмки.
## SCREEN-009 — Полный пульт телефона по локальной сети
- Статус: `TODO`
- Зависимость: SCREEN-005; использовать техническую основу SCREEN-001.
- Цель: управлять показом с компьютера и телефона одновременно без интернета.
- Объём: общий Vue-пульт и типы команд внутри screen, HTTP и WebSocket на выбранном
IPv4-интерфейсе; код сопряжения и подтверждение на компьютере, отзыв сеансов;
все режимы, шаги, таймер, музыка, громкость и перемотка. Загрузка игры и дисплей —
только на компьютере. Доверенная Wi-Fi/LAN или точка доступа; HTTP без шифрования.
- Готовность: основной процесс последовательно применяет команды обоих пультов,
рассылает актуальное состояние; повтор команды не применяется дважды. Потеря
связи блокирует телефон, но не показ; переподключение не повторяет команды.
Доступ без сопряжения запрещён; отключение пульта отзывает сеансы.
- Проверка: тесты валидации, сопряжения, отзыва, повторных/одновременных команд и
восстановления; type-check, lint, lint:css, build; Safari iPhone и Chrome Android,
блокировка телефона, потеря Wi-Fi, работа без интернета. Задержки телефона отдельно.
- Не входит: публичная сеть площадки, сертификаты, управление через интернет,
скачивание пакетов и настройка дисплеев с телефона.
- Следующий шаг: после SCREEN-005 подключить полный интерфейс к локальному
контроллеру через общий транспортный контракт и пройти мобильную приёмку.