45 KiB
Завершённые задачи приложения площадки
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 не выполнялись.