Files
evening_detective_screen/COMPLETED_TASKS.md
T
2026-10-17 19:52:24 +07:00

110 lines
12 KiB
Markdown

# Завершённые задачи приложения площадки
## 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 — существующая авторизация, выбор игры/скачивание
через интерфейс, снимок результатов и получение команд существующего сервера.