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

192 lines
20 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.
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/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-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 получает
обновления через экранную сессию и GetScreenState (существующий polling 1000 мс).
Серверные команды применяются локальным контроллером к подготовленным файлам;
повторная версия не применяется дважды. Прямого подключения телефона к desktop нет.
Уточнить минимальный серверный контракт по фактической реализации.
- Готовность: готовая игра открывается после перезапуска офлайн; секреты хранятся
средствами ОС, не в пакете; истечение сессии не обрывает уже подготовленный
локальный показ; обновления активируются явно. Результаты имеют время снимка.
Возврат сети не повторяет устаревшие команды поверх локальных действий.
При доступном сервере телефон управляет показом через существующий сайт; без сети
воспроизведение и пульт компьютера продолжают работать.
- Проверка: сценарии offline/reconnect/истёкшей сессии/обновления игры; проверки
затронутых репозиториев; существующий браузерный экран продолжает работать.
- Не входит: полноценная офлайн-игра, LAN-сервер и отдельный мобильный пульт 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; установка и полный показ офлайн,
переподключение проектора, восстановление сети и минимум час работы на каждой
тестовой конфигурации. Владелец выполняет аппаратную приёмку по инструкции агента.
- Не входит: публикация в магазинах приложений и автообновления.
- Следующий шаг: выбрать минимальный инструмент упаковки для всей матрицы,
проверить среду сборки и наличие сертификатов, собрать артефакты и подготовить
инструкции для аппаратной приёмки.