Files
evening_detective_screen/TASKS.md
T
2026-10-17 17:33:16 +07:00

163 lines
17 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.
# Задачи приложения площадки
Все задачи имеют статус TODO; выполнение ещё не начато. План и общие ограничения:
[PLAN.md](PLAN.md). Идентификаторы независимы от ED-* в корневом списке.
Обновлять статус и результат здесь; завершённые записи переносить в
`COMPLETED_TASKS.md` в этом каталоге после проверки. Коммиты и push не выполнять.
## SCREEN-001 — Проверить основу Electron на macOS, Windows и Linux
- Статус: `TODO`
- Зависимости: нет; первая задача.
- Цель: подтвердить выбор технологии на всех шести вариантах ОС/архитектуры
из 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. Владелец выполняет
аппаратные проверки по инструкции агента и передаёт результаты.
- Не входит: сервер, авторизация, скачивание, полный пульт, публикация.
- Следующий шаг: прочитать frontend-стандарт, создать минимальный проект с учётом
всей матрицы и подготовить сборки/инструкцию. Доступность всех шести вариантов
подтверждена владельцем; фактические конфигурации записать при проверке.
Непройденные аппаратные проверки явно оставить открытыми.
## 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 с телефона.
- Следующий шаг: сверить auth flow и модель сессий; зафиксировать правила
локального владения показом и отображения статуса на сервере.
## SCREEN-007 — Устойчивость на площадке
- Статус: `TODO`
- Зависимости: SCREEN-005, SCREEN-006.
- Цель: переживать типовые сбои без потери материалов и случайного показа пульта.
- Объём: отключение/возврат дисплея, смена разрешения и 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; установка и полный показ офлайн,
переподключение проектора, восстановление сети и минимум час работы на каждой
тестовой конфигурации. Владелец выполняет аппаратную приёмку по инструкции агента.
- Не входит: публикация в магазинах приложений и автообновления.
- Следующий шаг: выбрать минимальный инструмент упаковки для всей матрицы,
проверить среду сборки и наличие сертификатов, собрать артефакты и подготовить
инструкции для аппаратной приёмки.