470 lines
55 KiB
Markdown
470 lines
55 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 — существующая авторизация, выбор игры/скачивание
|
||
через интерфейс, снимок результатов и получение команд существующего сервера.
|
||
|
||
- Исправление по ревизии (2026-10-17): повторный снимок той же таблицы обновляет
|
||
дату получения без смены ревизии сцены и сброса прокрутки. Изменение вопросов,
|
||
строк или очистка результатов по-прежнему обновляют сцену. Добавлен регрессионный тест.
|
||
|
||
## SCREEN-006 — Подключение игры и синхронизация с сервером
|
||
|
||
- Статус: `DONE`
|
||
- Зависимости: SCREEN-002, SCREEN-005 (DONE, см. COMPLETED_TASKS.md).
|
||
- Цель: выбирать доступную организатору игру онлайн и сохранять автономность показа.
|
||
- Объём: существующая авторизация, список игр, загрузка пакета, снимок результатов,
|
||
индикатор связи, проверка новой версии материалов, синхронизация статуса показа.
|
||
Приложение экрана получает обновления от существующего сервера сайта через
|
||
экранную сессию и GetScreenState (существующий polling 1000 мс).
|
||
Серверные команды применяются локальным контроллером к подготовленным файлам;
|
||
повторная версия не применяется дважды.
|
||
Уточнить минимальный серверный контракт по фактической реализации.
|
||
- Готовность: готовая игра открывается после перезапуска офлайн; секреты хранятся
|
||
средствами ОС, не в пакете; истечение сессии не обрывает уже подготовленный
|
||
локальный показ; обновления активируются явно. Результаты имеют время снимка.
|
||
Возврат сети не повторяет устаревшие команды поверх локальных действий.
|
||
При доступном сервере приложение получает команды через экранную сессию;
|
||
без сети воспроизведение и пульт компьютера продолжают работать.
|
||
- Проверка: сценарии offline/reconnect/истёкшей сессии/обновления игры; проверки
|
||
затронутых репозиториев; существующий браузерный экран продолжает работать.
|
||
- Не входит: полноценная офлайн-игра и локальный сервер.
|
||
- Дата: 2026-10-17. Реализация только screen; бэкенд, сайт и protobuf не менялись.
|
||
- Результат: вход по email/паролю, проверка существующих прав, список игр,
|
||
единое обновление JWT для конкурентных запросов, выход без прерывания показа.
|
||
Токены и экранная сессия остаются в main; сохранение через safeStorage отдельно
|
||
от пакетов. При недоступном шифровании ОС (включая Linux basic_text) вход только
|
||
в памяти. Пароль не сохраняется, отказ в правах удаляет сохранённый вход.
|
||
- Материалы: загрузка/прогресс/отмена/проверка описания/повторная загрузка/удаление
|
||
через существующий PackageStore. Выбранная игра обновляется только при закрытом
|
||
показе; на время подготовки запрещены её открытие и смена выбора. Ошибка/отмена
|
||
сохраняют прежний пакет; новая версия включается остановленной. Ключ выбранного
|
||
пакета сохраняется, после перезапуска проверенная игра доступна офлайн без
|
||
автоматического открытия окна и звука. Снимок результатов сохраняется отдельно
|
||
по ключу пакета, содержит только поля таблицы и время получения; ошибка API
|
||
оставляет последний успешный снимок. Сервер выдаёт результаты после finish.
|
||
- Управление: локальный пульт компьютера и серверные команды. Создание и
|
||
привязка экранной сессии существующим API; GetScreenState раз в 1000 мс только
|
||
при открытом показе, без параллельных запросов. Первая версия при подключении,
|
||
повторном открытии и восстановлении сети — исходная отметка без старых команд.
|
||
Локальные действия немедленны и не рассылаются другим экранам. Версии int64
|
||
сравниваются без потери точности, повторы и откат версии не повторяют команды;
|
||
устаревшие ответы от другого окна/пакета/сессии отклоняются. Звук учитывается
|
||
независимо от версии, первоначальное назначение звука не запускает медиа.
|
||
Неподготовленные плейлисты не стримятся; переход музыки локальный, серверный
|
||
AdvanceScreenMusic вызывается однократно только для соответствующего трека.
|
||
- Контракт: сервер не принимает точные подтверждения проигрывания/ошибки от экрана.
|
||
На сайте сохраняется существующий heartbeat connected/disconnected; фактические
|
||
подтверждения видны в desktop. Последнее состояние может объединять несколько
|
||
команд между опросами. metadataVersion не обнаруживает замену байтов по тому же
|
||
URL, для этого нужна повторная загрузка. После неопределённого исхода перехода
|
||
музыки повторного POST нет. Права и публичная выдача файлов остались прежними.
|
||
- Проверки: type-check, ESLint, Stylelint, 63 теста (17 новых), сборка и GUI smoke —
|
||
PASS. GUI с реальным тестовым HTTP-сервером проверил форму входа, загрузку,
|
||
привязку, серверный play локального WAV, запрет обновления во время показа,
|
||
локальную паузу при повторном опросе, offline/reconnect без старого STOP,
|
||
новую команду после reconnect, результаты/выход и запреты IPC для окна показа.
|
||
Старые сценарии всех восьми режимов, медиа, Range и preview также прошли.
|
||
git diff --check — PASS; новые зависимости не добавлены, commit/push не выполнялись.
|
||
- Ограничения: тестовый сервер воспроизводит текущий JSON-контракт; рабочий сервер,
|
||
реальные игровые файлы и прежний браузерный экран вручную не проверялись.
|
||
GUI выполнен на Linux x64 с синтетическим внешним дисплеем и тестовыми флагами
|
||
no-sandbox/mute-audio/disable-gpu. Хранилища секретов остальных ОС, физический
|
||
звук/проектор и матрица платформ остаются для ручной приёмки; релизные архивы
|
||
не пересобирались. SCREEN-001/SCREEN-004 сохраняют IN_PROGRESS.
|
||
- Инструкция: docs/SCREEN-006_ACCEPTANCE.md. Следующий этап: SCREEN-007 —
|
||
устойчивость при отключении дисплея, управление сном и восстановление окон.
|
||
- Исправления по ревизии (2026-10-17, SCREEN-005/006): последнее полученное
|
||
назначение звука сохраняется отдельно от исходной отметки команд. Изменение
|
||
назначения после обрыва сети или повторного открытия показа применяется;
|
||
неизменное назначение не отменяет локальный mute. Перестановка тех же треков
|
||
теперь останавливает музыку с требованием повторной подготовки пакета.
|
||
- Проверка исправлений: 77 тестов (3 новых), type-check, ESLint, Stylelint,
|
||
сборка, GUI smoke и git diff --check — PASS. Вручную проверен весь diff на
|
||
применимые требования стандарта; нарушений не найдено. GUI: Linux x64,
|
||
синтетический дисплей, no-sandbox/mute-audio/disable-gpu; физический звук,
|
||
проектор и остальные ОС не проверялись, релизные архивы не пересобирались.
|
||
|
||
|
||
## SCREEN-010 — Редактирование серверного плана экранов в пульте
|
||
|
||
- Статус: `DONE`.
|
||
- Дата: 2026-10-18.
|
||
- Результат: список шагов с «Показать», выделением текущего шага и переходами
|
||
назад/вперёд; редактор добавления, удаления, порядка, восьми режимов, текста и
|
||
параметров таймера. Сохранение и удаление общего плана через существующий API;
|
||
отмена грязного черновика с подтверждением. Ошибка сохранения сохраняет черновик.
|
||
- Сервер: права и JWT проверяются прежним Online-транспортом; серверные операции
|
||
доступны только пульту. Бэкенд, сайт, protobuf и зависимости не изменены.
|
||
- Офлайн: подтверждённый план хранится отдельно от пакета по ключу игры,
|
||
восстанавливается после перезапуска. Локальная команда выполняется до сети;
|
||
серверные запросы упорядочены, устаревшие ответы и неотправленные промежуточные
|
||
переходы пропускаются. После обрыва ожидающие действия не повторяются;
|
||
возврат сети сам не меняет показ. Следующее новое действие снова пробует сервер.
|
||
- Синхронизация: план обновляется и при закрытом показе; фоновый опрос не меняет
|
||
черновик. Последнее сохранение заменяет общий план. Сохранение не меняет сцену;
|
||
изменение активного шага снимает выделение. Собственные подтверждения не
|
||
сбрасывают повторно таймер/медиа, конкурентный переход с сайта учитывается.
|
||
- Проверки: type-check, ESLint, Stylelint, 88 тестов, сборка и полный Electron
|
||
GUI smoke — PASS. Smoke покрывает редактор, отказ сохранения, текст/таймер,
|
||
перестановку, отмену, удаление и запрет IPC из окна показа. Отдельные тесты
|
||
покрывают офлайн/перезапуск, быстрые переходы, запоздалые ответы, смену игры,
|
||
конкурентный таймер и назначение звука. Проверки HTTP/GUI выполнялись вне
|
||
песочницы; внутри неё HTTP-тест получает EPERM.
|
||
- Ревью: ручная проверка diff по применимым правилам и независимое ревью
|
||
синхронизации; найденные ошибки исправлены, добавлены регрессионные тесты.
|
||
git diff --check — PASS. README и руководство ведущего обновлены.
|
||
- Ограничения: GUI использует синтетический внешний дисплей и локальный тестовый
|
||
сервер; физический проектор, звук и рабочий сервер отдельно не проверялись.
|
||
Сборка предупреждает о JS chunk >500 kB. Установочные архивы не пересобирались;
|
||
commit и push не выполнялись.
|
||
|
||
|
||
## SCREEN-011 — Актуализировать описание взаимодействия экрана и сервера
|
||
|
||
- Статус: `DONE`.
|
||
- Дата: 2026-10-18.
|
||
- Результат: из README, плана, задач, архива, руководства и инструкций приёмки
|
||
удалены описания и требования проверки исключённого способа управления.
|
||
Документация описывает приложение экрана, сервер и существующий сайт.
|
||
ID отменённой SCREEN-009 и фактические результаты прежних проверок сохранены.
|
||
- Границы: изменена только документация evening_detective_screen; код,
|
||
серверные API, синхронизация и установочные архивы не менялись.
|
||
- Проверки: повторный поиск устаревших упоминаний, локальные Markdown-ссылки,
|
||
ссылки на переименованные разделы, ручное ревью diff и git diff --check — PASS.
|
||
Тесты приложения не запускались: исполняемый код не менялся.
|
||
|
||
## SCREEN-012 — Постоянная синхронизация и автоматическая подготовка материалов
|
||
|
||
- Статус: `DONE`.
|
||
- Дата: 2026-10-18.
|
||
- Результат: опрос сервера каждую секунду, включая закрытый показ; при подключении,
|
||
повторном открытии и восстановлении связи принимается актуальное состояние
|
||
экрана и музыки. Окно показа автоматически не открывается.
|
||
- Игра подключается без готового пакета. Отсутствующие материалы автоматически
|
||
скачиваются атомарно в локальный кеш; проигрыватель читает только локальные URL.
|
||
Текущие экран и музыка готовятся первыми, затем остальные материалы игры и
|
||
связанных плейлистов. До готовности замены сохраняется предыдущий канал;
|
||
ожидание музыки не задерживает смену текста или другой готовой сцены.
|
||
- Локальные команды с готовыми файлами применяются сразу и отправляются серверу;
|
||
офлайн-команды после восстановления связи не повторяются. Текст публикуется
|
||
существующим API плана. Исправлены гонки смены файла, подтверждения команд,
|
||
завершения прежнего трека и обновления описания кеша. Предзагрузка следующего
|
||
трека начинается только после завершения его загрузки.
|
||
- Проверки: 99 тестов, type-check, lint, lint:css, сборка и Electron GUI smoke — PASS.
|
||
GUI проверяет подключение без пакета, дозагрузку с сохранением прежней музыки,
|
||
независимую смену текста, локальное воспроизведение нового трека, восстановление
|
||
связи, план и устойчивость показа. 33 локальные Markdown-ссылки и
|
||
git diff --check — PASS.
|
||
- Границы: изменения только evening_detective_screen; сервер, сайт, protobuf
|
||
и зависимости не менялись. Установочные архивы не пересобирались; реальный
|
||
сервер и физический проектор/звук не проверялись. Замена байтов по прежнему
|
||
URL требует ручной повторной загрузки; точность позиции ограничена API сервера.
|
||
Commit/push не выполнялись.
|
||
|
||
## SCREEN-013 — Убрать блок «Материалы показа»
|
||
|
||
- Статус: `DONE`.
|
||
- Дата: 2026-10-18.
|
||
- Результат: с пульта удалён блок выбора локального пакета, тестового режима
|
||
и удаления материалов. Убраны его обработчики, список пакетов и неиспользуемое
|
||
событие ConnectionPanel. В настройки ничего не переносилось.
|
||
- Подключение игры через сервер, автоматический кеш и воспроизведение с диска
|
||
сохранены. Руководство, README и инструкции приёмки обновлены; smoke выбирает
|
||
тестовый пакет через существующий IPC и проверяет отсутствие блока в интерфейсе.
|
||
- Проверки: type-check, lint, lint:css, сборка, Electron GUI smoke
|
||
(локальный показ, связь, дозагрузка, план и устойчивость) и git diff --check — PASS.
|
||
- Границы: изменения только evening_detective_screen. Архивы не пересобирались;
|
||
физический проектор не проверялся. Commit/push не выполнялись.
|
||
|
||
## SCREEN-014 — Настройка экранов только через план
|
||
|
||
- Статус: `DONE`.
|
||
- Дата: 2026-10-18.
|
||
- Результат: удалены блок «Текст и таймер», отдельный переключатель режима
|
||
и используемые только ими поля/обработчики. Режим, текст, подпись и длительность
|
||
таймера настраиваются в редакторе шагов. Пустой план предлагает создать план.
|
||
- Управление таймером сохранено в активном шаге; статус и остаток таймера показаны
|
||
рядом с планом, включая отсчёт в фоне. Предпросмотр, музыка, дисплей, API,
|
||
типы команд и серверная синхронизация сохранены.
|
||
- Проверки: type-check, lint, lint:css, сборка и Electron GUI smoke — PASS.
|
||
Проверены отсутствие удалённых элементов, редактирование текста/таймера,
|
||
сохранение, переходы, старт/пауза таймера, локальный показ и синхронизация.
|
||
33 локальные Markdown-ссылки и git diff --check — PASS.
|
||
- Границы: изменения только evening_detective_screen. Архивы не пересобирались;
|
||
физический проектор не проверялся. Commit/push не выполнялись.
|
||
|
||
## SCREEN-015 — Управление вступлением и видео через план
|
||
|
||
- Статус: `DONE`.
|
||
- Дата: 2026-10-18.
|
||
- Результат: удалён отдельный блок «Вступление и видео» и ручной выбор медиа.
|
||
Файл определяется режимом шага. В активном шаге «Введение»/«Закрывашка» доступны
|
||
управление воспроизведением, громкость, перемотка, позиция, длительность,
|
||
статус, ошибка и прежние программные замеры основного канала.
|
||
- Воспроизведение и перемотка требуют открытого показа и выбранного файла.
|
||
Музыка и общий mute сохранены отдельно. Серверный API и типы команд не менялись.
|
||
- Проверки: type-check, lint, lint:css, сборка, Electron GUI smoke — PASS.
|
||
GUI проверяет отсутствие блока, запуск/паузу/стоп в обоих медийных шагах,
|
||
перемотку и громкость на паузе, независимость музыки, план и синхронизацию.
|
||
Документация обновлена; локальные Markdown-ссылки и git diff --check — PASS.
|
||
- Границы: изменения только evening_detective_screen. Архивы не пересобирались;
|
||
физический проектор не проверялся. Commit/push не выполнялись.
|
||
|
||
## SCREEN-016 — Адрес сервера по умолчанию
|
||
|
||
- Статус: `DONE`.
|
||
- Дата: 2026-10-18.
|
||
- Результат: на чистом профиле подставляется https://evening-detective.crabs-games.art.
|
||
Этот известный адрес преобразуется в https://evening-detective-api.crabs-games.art
|
||
перед обращением к API. Сохранённый адрес имеет приоритет; остальные адреса,
|
||
включая localhost, не преобразуются. Руководство обновлено.
|
||
- Проверки: 102 теста, type-check, lint, lint:css и git diff --check — PASS.
|
||
Добавлены проверки чистого профиля, входа через адрес сайта, локального адреса
|
||
и восстановления сохранённых адресов после перезапуска.
|
||
- Границы: изменения только evening_detective_screen. Реальный вход с учётными
|
||
данными production не проверялся; установочные архивы не пересобирались.
|
||
Commit/push не выполнялись.
|
||
|
||
## SCREEN-017 — Повтор статуса подключения после обновления игр
|
||
|
||
- Статус: `DONE`.
|
||
- Дата: 2026-10-18.
|
||
- Результат: по снимку владельца подтверждены пять строк статуса внутри блока
|
||
«Игра и сервер». Внешний n-space заменён обычным flex-контейнером: устранена
|
||
зависимость условной разметки от flatten и одинаковых ключей обёрток библиотеки.
|
||
Поведение API и подключения не менялось.
|
||
- Проверки: type-check, lint, lint:css, сборка, git diff --check и Electron smoke — PASS.
|
||
В GUI добавлены пять последовательных обновлений с чередованием пустого и
|
||
непустого списка игр и проверкой единственной строки статуса. Подключение,
|
||
дозагрузка, план и воспроизведение проходят прежние сценарии.
|
||
- Ограничение: исходное накопление строк в изолированном профиле до изменения
|
||
не воспроизвелось; результат в пользовательском dev-окне требует перезапуска
|
||
и подтверждения владельцем. Изменения только evening_detective_screen;
|
||
архивы не пересобирались, commit/push не выполнялись.
|
||
|
||
## SCREEN-018 — Причина ошибки подключения игры
|
||
|
||
- Статус: `DONE`.
|
||
- Дата: 2026-10-18.
|
||
- Результат: ошибки авторизации и смены сессии при подготовке игры больше
|
||
не заменяются сообщением «Сервер недоступен». Сетевые ошибки называют запрос
|
||
(описание игры, план экранов, музыка), различают отмену, таймаут, DNS,
|
||
отказ/сброс соединения и ошибки сертификата. Неизвестные сообщения исключений
|
||
не отображаются и не журналируются.
|
||
- В диагностический журнал добавлено событие request-error: только разрешённый
|
||
шаблон пути и код причины, без URL, ID игры, токенов и содержимого ответа.
|
||
Общие типы транспортных ошибок используются загрузчиком описания и Online.
|
||
- Проверки: 107 тестов, type-check, lint, lint:css, сборка, Electron GUI smoke,
|
||
33 локальные Markdown-ссылки и git diff --check — PASS. Проверены ошибки
|
||
каждого запроса, отмена, таймаут, истёкшая авторизация, смена сессии и журнал
|
||
без секретов. Вход через Online в http://127.0.0.1:8090 успешен; последующий
|
||
список игр возвращает прежний HTTP 500 из-за устаревшей локальной схемы БД.
|
||
- Ограничения: причина исходного сетевого сбоя публичного API пока не установлена;
|
||
новая диагностика предназначена для следующего воспроизведения. Изменения
|
||
только evening_detective_screen, сервер и схема БД не менялись. Установочные
|
||
архивы не пересобирались; commit/push не выполнялись.
|
||
|
||
## SCREEN-019 — Клиент API из proto
|
||
|
||
- Статус: `DONE`.
|
||
- Дата: 2026-10-18.
|
||
- Результат: добавлена npm run proto:gen с protoc 36.0 и тем же плагином,
|
||
что во frontend (protoc-gen-typescript-http v0.10.0). Источник — канонический
|
||
../evening_detective_server/api/main.proto; генерация пишет только в screen.
|
||
Сгенерированный клиент хранится в electron/api/generated; сборка не требует
|
||
генератора или соседних репозиториев. Генерируемые файлы исключены из линтера.
|
||
- Все API-вызовы Online и загрузчика описания переведены на сгенерированные методы:
|
||
вход, refresh, пользователь, игры, план, состояние/привязка/звук экрана,
|
||
музыка и результаты. Удалён ручной сборщик API-путей/JSON-тел. Локальные режимы
|
||
преобразуются в строковые enum proto; сохранены проверки ответов и точность
|
||
строковых int64 через BigInt, авторизация, таймауты, отмена и диагностика.
|
||
Медиа, кеш и воспроизведение остаются локальными; runtime-зависимости не добавлены.
|
||
- Проверки: повторная генерация побайтово идентична; 109 тестов, type-check,
|
||
lint, lint:css, сборка, Electron GUI smoke, 33 локальные Markdown-ссылки
|
||
и git diff --check — PASS. Добавлена проверка HTTP-методов/маршрутов, JSON enum,
|
||
отсутствующих полей и int64 выше Number.MAX_SAFE_INTEGER. GUI проверяет вход,
|
||
подключение, план, команды, музыку, дозагрузку, переподключение и показ.
|
||
- Локальное API: сгенерированные Login/GetMe успешны; GetGames возвращает прежний
|
||
HTTP 500 из-за устаревшей схемы локальной БД. Production-вход и физический
|
||
проектор не проверялись. Декларации int64 генератора требуют сохранения проверки
|
||
границы JSON; напрямую трактовать их как number нельзя. Ограничение описано в README.
|
||
- Границы: изменения только evening_detective_screen. Сервер, frontend и proto
|
||
не менялись, установочные архивы не пересобирались; commit/push не выполнялись.
|
||
|
||
## SCREEN-020 — Подробные ошибки API в интерфейсе
|
||
|
||
- Статус: `DONE`.
|
||
- Дата: 2026-10-18.
|
||
- Результат: существующие сообщения ошибок показывают операцию, метод и путь API,
|
||
HTTP-статус или разрешённый код сети. Ошибки описания игры, плана, музыки и
|
||
состояния экрана указывают путь поля с индексами, ожидаемый и фактический тип.
|
||
Правила обязательности и допустимые значения полей сохранены.
|
||
- Контекст запроса сохраняет типы ошибок авторизации/сети/смены сессии; повторное
|
||
добавление префикса предотвращено. Ошибки доступны через существующие поля
|
||
состояния, в том числе в фоновой подготовке. Длинные строки переносятся в
|
||
блоке подключения и предупреждении плана. Значения полей, тела ответов,
|
||
query-параметры, пароли, токены и stack trace в интерфейс не передаются.
|
||
- Проверки: 113 тестов, type-check, lint, lint:css, сборка, Electron GUI smoke,
|
||
33 локальные Markdown-ссылки и git diff --check — PASS. Добавлены проверки
|
||
отсутствующего/null/массивного/строкового поля истории, индексов плана и треков,
|
||
HTTP-статуса, сетевых кодов, состояния экрана и отсутствия секретов. GUI
|
||
проверяет подробности ошибки истории, перенос текста и успешное подключение
|
||
после исправления тестового ответа.
|
||
- Границы: изменения только evening_detective_screen. Сервер и сгенерированный
|
||
клиент не менялись. Production-ошибка не воспроизводилась; установочные
|
||
архивы не пересобирались, commit/push не выполнялись.
|
||
|
||
## SCREEN-021 — Подключение игры без обязательного story
|
||
|
||
- Статус: `DONE`.
|
||
- Дата: 2026-10-18.
|
||
- Результат: scenario и story могут отсутствовать или быть null. Игра и её ID
|
||
остаются обязательными; неверные типы присутствующих полей дают подробную ошибку.
|
||
После получения GetScreenState обложка, фон, вступление и видео берутся из его
|
||
ссылок, включая пустые значения как отсутствие файла. До получения состояния
|
||
используются доступные материалы GetGame; полный сценарий отдельно не запрашивается.
|
||
- Ссылки включаются в существующее описание и автоматически скачиваются локально.
|
||
Сохранены защита от устаревших загрузок, прежний показ до готовности замены,
|
||
чтение кеша после перезапуска и формат пакета. Явно отсутствующий фон сохраняется
|
||
при наличии обложки, без восстановления неявного fallback при чтении манифеста.
|
||
Без медиа работают текст, таймер и музыка; вступление/видео показывают «не задано».
|
||
- Проверки: 118 тестов, type-check, lint, lint:css, сборка, Electron GUI smoke,
|
||
локальные Markdown-ссылки и git diff --check — PASS. Проверены отсутствие/null
|
||
scenario/story, неверные типы, приоритет ссылок состояния и очистка медиа,
|
||
восстановление кеша, подключение/локальное воспроизведение без истории и показ
|
||
текста/таймера/музыки без основного файла. GUI использует GetGame со story:null,
|
||
получает вступление из GetScreenState, затем проверяет явное отсутствие вступления.
|
||
Ожидание готовности списка игр в smoke уточнено после раннего нажатия выбора.
|
||
- Границы: изменения только evening_detective_screen. Сервер, proto и клиент
|
||
генерации не менялись. Production-подключение не проверялось; установочные
|
||
архивы не пересобирались, commit/push не выполнялись.
|
||
|
||
## SCREEN-022 — Пять блоков управления и редактор музыки
|
||
|
||
- Статус: `DONE` (2026-10-18).
|
||
- Согласованный план: Сервер, Игра, Экран, План экранов, План музыки; CRUD плейлистов, MP3, ручной порядок; звук включён на 100% при явном подключении игры.
|
||
- Изменения разрешены в приложении экрана, сервере и protobuf-клиентах сайта.
|
||
- Проверка: тесты и проверки трёх репозиториев, Electron smoke, ручное ревью стандартов.
|
||
- Результат: пять карточек в согласованном порядке; предпросмотр, монитор, назначение звука и mute находятся в «Экран». Один общий цикл состояния подключения. В «План музыки» доступны CRUD плейлистов, native MP3 до 64 МиБ, сохранение/отмена порядка, явное назначение игре; выбор редактора не меняет воспроизведение.
|
||
- Звук: локально оба канала начинаются с 100% и без mute; явный BindScreen(initializeAudio=true) назначает звук и устанавливает уровни на сервере, сохраняя транспорт. Автовосстановление связи уровни не сбрасывает. Первичная привязка копирует текущий показ отдельно, повторная не переинициализирует его.
|
||
- Сервер: ReorderPlaylistTracks атомарно проверяет состав и меняет позиции/индексы по ID трека; GetMusic читает согласованный snapshot. Параллельные загрузки сериализованы; используемость учитывает game_music_states. Новые поля/API сгенерированы штатно во всех трёх репозиториях; два вызова сайта явно сохраняют прежний режим привязки. Без новых зависимостей и миграций схемы.
|
||
- Проверка: 121 тест приложения, type-check, ESLint, Stylelint, build и Electron GUI smoke — PASS. GUI проверяет все пять карточек, CRUD, сохранение ввода при опросе, native MP3, назначение игре, отмену/сохранение порядка без смены файла/операции/позиции. Сервер go test ./... — PASS; отдельная локальная PostgreSQL-база проверила атомарность/конфликты, сохранение track ID/тайминга, совместные чтение и перестановку, параллельные загрузки и назначение звука двум экранам. Сайт: type-check, lint, lint:css, build-only — PASS.
|
||
- Ревью: полный diff вручную проверен по Go/frontend стандартам, независимые ревью сервера и приложения учтены; git diff --check во всех трёх репозиториях — PASS. Документация и чек-лист обновлены.
|
||
- Ограничения: рабочий сервер не развёртывался; для нового API нужен обновлённый бэкенд. Установочные архивы и аппаратная матрица не пересобирались/не проверялись. Коммиты и push не выполнялись.
|
||
|
||
## SCREEN-023 — Сократить интерфейс пульта
|
||
|
||
- Статус: `DONE` (2026-10-18).
|
||
- План: сохранить пять блоков и раскрытые редакторы; убрать пояснения, технические статусы и дубли команд, объединить подключение и кнопки воспроизведения по состоянию.
|
||
- Границы: только приложение экрана; сервер, API и начальную громкость не менять.
|
||
- Проверка: тесты, type-check, lint, lint:css, build и обновлённый Electron smoke.
|
||
- Результат: сохранены пять блоков и раскрытые редакторы; удалены постоянные инструкции, технические замеры, повторные статусы и ручные действия, уже выполняемые автоматически. Подключение выбранной/текущей подготовленной игры объединено. Для медиа одна кнопка запуска/паузы/продолжения, рядом «Стоп» и «Сначала»; для таймера одна кнопка состояния и сброс. Текущая локальная игра видна и после выхода.
|
||
- Ошибки и подтверждения сохранены; фоновое обновление библиотеки больше не стирает подробную ошибку пользовательского действия. Описание интерфейса обновлено в руководстве и чек-листе.
|
||
- Проверка: 127 тестов, type-check, ESLint, Stylelint, build и Electron GUI smoke — PASS. GUI проверяет пять блоков, отсутствие удалённых элементов, подключение обеих целей одной кнопкой, запуск/паузу/продолжение/повтор медиа, управление таймером, автоматические результаты, CRUD и порядок музыки, подробные ошибки и сохранение названия игры после выхода.
|
||
- Ревью: весь diff проверен вручную по frontend-стандарту; git diff --check — PASS. Изменения только в evening_detective_screen; сервер, API, зависимости и громкость не менялись. Установочные архивы не пересобирались, аппаратная матрица не проверялась; commit/push не выполнялись.
|