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

23 KiB
Raw Blame History

Задачи приложения площадки

SCREEN-001 имеет статус IN_PROGRESS; остальные задачи — TODO. План и общие ограничения: 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 подключить полный интерфейс к локальному контроллеру через общий транспортный контракт и пройти мобильную приёмку.