This commit is contained in:
2026-10-17 20:57:16 +07:00
parent 40456eebf1
commit 1d4028b183
13 changed files with 849 additions and 48 deletions
+29 -5
View File
@@ -21,8 +21,10 @@ macOS Intel/Apple Silicon, Windows x64/ARM64 и Linux x64/ARM64.
общего правила хранения задач в `../docs/agent`. Не дублировать их там.
Идентификаторы `SCREEN-*` относятся только к этому приложению.
Следующий этап: SCREEN-007 — устойчивость на площадке; аппаратная проверка
SCREEN-001/SCREEN-004 остаётся открытой.
Программная часть SCREEN-007 реализована: обработка сбоев показа, пауза таймера,
предотвращение автоматического сна и восстановление пульта. SCREEN-007 вместе
с SCREEN-001/SCREEN-004 остаётся IN_PROGRESS до аппаратной приёмки.
[Инструкция проверки устойчивости](docs/SCREEN-007_ACCEPTANCE.md).
Новые задачи: `Новая задача: <описание>`.
Commit и push выполняет только пользователь. Вложенные `.git` не изменять.
@@ -173,7 +175,7 @@ URL, независимо от исходного имени файла. Лок
`selectPackage(null)` включает тестовый режим. Выбор повторно проверяет пакет.
Закрытие или пересоздание окна и смена пакета создают новую сессию и останавливают
каналы; повторное открытие не возобновляет звук. После перезапуска всего приложения
выбор начинается с тестового режима; сохранение выбора относится к SCREEN-007.
готовый выбранный пакет восстанавливается механизмом SCREEN-006 без автопуска.
Для ручной проверки с настоящим внешним дисплеем выполните `npm run acceptance`.
Команда использует синтетические fixtures и отдельный временный userData, создаёт
@@ -204,8 +206,10 @@ URL, независимо от исходного имени файла. Лок
Таймер вычисляется в основном процессе по монотонному deadline; интервалы только
обновляют снимок. Пауза сохраняет точный остаток, сброс возвращает полную длительность.
Таймер продолжает идти за другой сценой и при закрытом окне; смена пакета сбрасывает
его. По окончании остаётся 00:00, без сигнала и смены режима. Восстановление после
сна/перезапуска относится к SCREEN-007.
его. По окончании остаётся 00:00, без сигнала и смены режима. С SCREEN-007 аварийное
закрытие (дисплей, сон ОС, fullscreen или renderer) ставит работающий таймер на
паузу с точным остатком. После пробуждения требуется вручную открыть показ и
продолжить отсчёт; перезапуск приложения не возобновляет таймер.
Обложка и фон читаются через локальный протокол. Новая подготовка использует
адрес с идентификатором сцены, исключая устаревший декодированный кеш изображения.
@@ -235,3 +239,23 @@ capturedAt, вопросы и публичные строки таблицы (ID
изображения, отсутствие второго звука, предел частоты кадров предпросмотра,
кириллицу и отрисовку/прокрутку 50 синтетических строк результатов. Эти строки
подаются только в тестовый renderer и не сохраняются в состоянии приложения.
## Устойчивость SCREEN-007
Отключение выбранного дисплея, превращение его в основной, смена разрешения,
масштаба/ориентации, выход из fullscreen, сон ОС, падение или зависание renderer
закрывают показ и останавливают оба медиаканала. Причина видна в пульте; возврат
устройства не запускает окно и звук. Для повторного вывода нажмите «Открыть показ».
Пульт и показ используют разные сессии Electron; падение renderer показа
обрабатывается независимо от пульта. Выбор аудиовыхода остаётся в настройках ОС.
При открытом показе удерживается prevent-display-sleep, включая статичные сцены
и паузу. Эта блокировка не отменяет принудительный сон или закрытие крышки.
Пульт сохраняет bounds/maximized в userData/windows.json и восстанавливается
в пределах основного экрана; внешний дисплей предвыбирается только по совпадающим
ID и названию. Ошибка файла настроек не удаляет материалы или секреты.
GUI smoke на стенде без внешнего дисплея моделирует topology/fullscreen/питание;
native fullscreen проверяется при наличии реального второго экрана. Реальное
предотвращение сна, маршрутизацию звука ОС и физическое переподключение оборудования
проверять по [инструкции SCREEN-007](docs/SCREEN-007_ACCEPTANCE.md) на всей матрице.