# Завершённые задачи приложения площадки ## SCREEN-002 — Собрать описание пакета через существующий API - Статус: `DONE`. - Дата: 2026-10-17. - Репозиторий: только screen; бэкенд, frontend и protobuf не изменены. - Уточнение владельца: использовать текущий API без изменений бэкенда; SCREEN-002 разрешена до завершения аппаратной приёмки SCREEN-001. - Результат: `electron/screen-package.ts` получает игру, план и музыку через существующие GET endpoints и собирает ScreenPackage версии формата 1. Пакет содержит обложку, фон (с подстановкой обложки), вступительное аудио, заключительное видео, шаги и связанные плейлисты со всеми треками. Ссылки дедуплицируются, треки упорядочены по позиции/ID, посторонняя библиотека, данные участников и живые команды исключены. - Авторизация: существующий JWT используется только для API указанного сервера, не сохраняется в результате; редиректы API запрещены. Поддерживаются отмена, таймаут и безопасные ошибки без содержимого серверных ответов. Адреса с логином/паролем и ссылки с секретными параметрами отклоняются. - Версия: metadataVersion — детерминированный SHA-256 нормализованных метаданных. Идентификаторы ресурсов — SHA-256 URL. Это не контрольные суммы файлов и не подтверждение готовности пакета. Размеры, хеши байтов и итоговая версия — SCREEN-003. Сервер не предоставляет атомарного снимка и хешей ресурсов. - Проверки: `npm run type-check`, `npm run lint`, `npm run lint:css`, `npm test` (12 тестов, включая 8 новых), `npm run build`, `git diff --check` — PASS. - Ограничения: проверено на фикстурах текущего JSON-контракта, живой сервер и реальные игровые файлы не проверялись. Загрузки файлов и новых кнопок нет; программный контракт подключается к интерфейсу при SCREEN-006. Существующие права доступа и публичная выдача файлов не менялись. Установочные архивы не пересобирались; аппаратная приёмка SCREEN-001 остаётся открытой. - Следующий шаг: SCREEN-003 — скачать и проверить файлы, сформировать итоговую версию и атомарно активировать готовый локальный пакет. ## SCREEN-003 — Скачивать и проверять материалы на диске - Статус: `DONE`. - Дата: 2026-10-17. - Репозиторий: только screen; бэкенд, frontend и protobuf не изменены. - Результат: PackageStore в основном процессе; потоковая последовательная загрузка, отмена, прогресс, контроль свободного места с резервом 64 МиБ, SHA-256/размер при записи и повторная проверка с диска. При обрыве повторяется целый текущий файл (выбор владельца); максимум три попытки, паузы 1/3 секунды, таймаут 30 секунд. - Хранение: userData/packages, отдельные каталоги игры и версий, временная загрузка, синхронизация файлов, атомарная замена указателя текущей версии. Неудачное обновление сохраняет предыдущую готовую копию; отмена удаляет временные данные. При перезапуске проверяются все файлы и очищаются оставшиеся временные/старые версии. Повреждённый текущий пакет не становится готовым и доступен для удаления либо восстановления повторной загрузкой. Приложение запускается одним экземпляром. - Доступ: локальная выдача только готовых файлов по ключу игры и ID ресурса, MIME/Range/no-store; произвольные пути и симлинки отклоняются. Скачивание медиа без JWT/cookies, до пяти проверенных редиректов, запрет HTTPS→HTTP и URL с секретами. Учтены MIME audio/wave и application/ogg существующего бэкенда. - Проверки: `npm run type-check`, `npm run lint`, `npm run lint:css`, `npm test` (26 тестов, 14 новых), сборка в составе `npm run smoke`, `git diff --check` — PASS. Протестированы обрывы/повторы, отмена до активации, нехватка места до и во время загрузки, таймаут, повреждение при проверке/после перезапуска, восстановление, следы сбоя, редиректы, ошибочные ответы, симлинки и запрет параллельных изменений. - Офлайн-проверка: настоящий HTTP-сервер выключен после загрузки, новое хранилище восстановило и прочитало пакет. GUI smoke Electron 42.11.15: повторное открытие хранилища, WAV через локальный протокол, Range 206/44 байта, длительность 60 секунд, воспроизведение — PASS; тестовые --no-sandbox --mute-audio --disable-gpu. - Ограничения: проверено на текущем Linux x64; macOS/Windows и аппаратная матрица SCREEN-001 остаются открытыми. GUI использовал синтетический второй дисплей. Рабочий сервер и реальные игровые материалы не проверялись; сервер не выдаёт эталонных хешей и атомарного снимка. Установочные архивы не пересобирались. UI загрузки/вход остаётся в SCREEN-006; хранилище предоставляет программный API. - Следующий шаг: SCREEN-004 — подключить подготовленные локальные ресурсы к проигрывателю и игровым командам без ожидания сети. ## SCREEN-005 — Пульт ведущего и все режимы показа - Статус: `DONE`. - Дата: 2026-10-17. - Репозиторий: только screen; бэкенд, frontend сайта и protobuf не изменены, новых зависимостей нет. Разработка продолжена по запросу владельца; аппаратная приёмка SCREEN-004 остаётся открытой. - Результат: все восемь ScreenMode, локальные обложка/фон, сообщения завершения, текст без HTML, список шагов с предыдущим/следующим, редакторы черновиков текста и таймера. Выбор шага не запускает звук/таймер, уход из основного медиарежима останавливает основной канал; музыка остаётся независимой. Ошибки и кнопки остаются на пульте. Готовность подтверждается окном после подготовки сцены. - Таймер: монотонное время в main, точный остаток, пауза/продолжение/сброс, отсчёт за другой сценой/закрытым окном, сброс при смене пакета. Интервалы и медиаснимки не накапливают дрейф; окончание не запускает звук или другой режим. - Предпросмотр: выбранный владельцем вариант реального окна, capturePage до 2 FPS, ширина до 960 px, один текущий кадр, проверка прав и сессии/ревизии. Нет второго проигрывателя; при закрытии окна и скрытии/сворачивании пульта захват прекращается. - Результаты: локальный контракт ResultsSnapshot, whitelist публичных полей, проверка ключа игры/времени/чисел/повторов, время снимка на пульте, таблица с прокруткой. Реальное получение/сохранение остаётся в SCREEN-006; без снимка честное пустое состояние. Смена пакета очищает снимок. - Проверки: `npm run type-check`, `npm run lint`, `npm run lint:css`, `npm test` (46 тестов, 9 новых), сборка и GUI smoke, `git diff --check` — PASS. Проверены все восемь шагов, локальные изображения, кириллица/системный шрифт, черновик текста/экранирование HTML, таймер за скрытой сценой, права IPC, предпросмотр (10 захватов, ограничение частоты, без аудио/видео в пульте), повреждение/восстановление картинки, таблица на 50 синтетических командах и сохранение её прокрутки при обновлениях. Фикстура результатов существует только в тестовом renderer; после пересоздания окна в main результатов по-прежнему нет. - Исправление по GUI: Chromium повторно использовал декодированную картинку после повреждения файла. Новый адрес изображения на каждую подготовку сцены устранил ложную готовность; повторный прогон проверил ошибку и восстановление. - Ограничения: текущий Linux x64/Electron 42.11.15, синтетический внешний дисплей, тестовые --no-sandbox --mute-audio --disable-gpu. Рабочий сервер, реальные игровые материалы и самостоятельный аппаратный/ручной проход владельца не проверялись. macOS/Windows и физический p95 на M1 не подтверждены; архивы не пересобирались. Инструкция ручной проверки — docs/SCREEN-005_ACCEPTANCE.md, запуск npm run acceptance. - Следующий шаг: SCREEN-006 — существующая авторизация, выбор игры/скачивание через интерфейс, снимок результатов и получение команд существующего сервера.