# Изменения и история ## BUILD197 — 22 октября 2026 · 2026.10.22.3 Commit: `BUILD197 — отправлять поздние составы и показывать этапы загрузки`. - Основной Mapping ждёт получения составов обеих команд. Поздние изменения состава из деталей/LIVE автоматически запускают свежую отправку выбранному Agent. - Новая версия состава не переиспользует результат начатого раньше Mapping; одинаковые снимки объединяются, счёт/статистика/время не вызывают лишних отправок. - Окно открытия остаётся до загрузки составов и подтверждения Mapping, показывает реальные этапы и краткую историю. При отсутствии данных доступны повтор/продолжение. - Через 45 с долгого ожидания показывается предупреждение с возможностью продолжить. Этот срок не прерывает Mapping и не повторяет запрос с неизвестным результатом. - Старые ответы не закрывают новое окно и не меняют выбранные матч/Agent/сессию. Пока окно открыто, эфирные горячие клавиши заблокированы. - Native Countdown, Windows Agent 1.5.5, зависимости и настройки не менялись. Проверки BUILD197: **902 passed, 0 failed**, без skip/xfail. Проверены поздние составы, новая отправка Mapping, ожидание/повтор, таймеры и изоляция Agent; окно проверено в локальном Chromium при 390/1280 px. Подключения к рабочей VM и реальному vMix не выполнялись. ## BUILD196 — 22 октября 2026 · 2026.10.22.2 Commit: `BUILD196 — обновлять большинство и составы, задерживать связанные плашки`. - Сохранение работающих таймеров сохраняет ближайший срок отправки. Тики основного времени и удалений больше не откладывают обновление численных составов до остановки часов. - Ожидающие сохранения перепроверяют текущий запрос, устраняя параллельные повторные PUT после медленного ответа. Последнее состояние доходит до сервера. - Истёкший таймер удаления получает нулевую длительность перед сбросом и снятием плашки. Следующий действующий таймер обновляется в своём назначении; остальные работающие Countdown не перезапускаются при завершении соседнего удаления. - Новая плашка ждёт сохранения численного состава и окончания обновления Mapping. - У слотов удалений и связанных шагов верхнего счёта добавлено поле «После верхнего счёта, с». Для пустых ворот и отложенного штрафа такое же поле находится в админке «Таймеры и составы». Диапазон 0–60 с, шаг 0,1 с; 0 — сразу. - Ожидание отсчитывается от выдачи основного титра и не блокирует управление временем. После снятия счёта, смены матча, Agent, сессии или прав старый показ отменяется. При срабатывании задержки заново читаются действующие удаления и флаги. - Ответы старых запросов состояния Overlay не восстанавливают плашки в новом контексте. - Готовый состав принимается при LIVE-ответе `changed:false`. Пустой кэш завершённого матча дозагружается; отсутствующие строки состава восстанавливаются из сохранённого источника. Полный кэш завершённого матча по-прежнему открывается без запроса к API. - Agent 1.5.5 и зависимости не менялись; настройки обновлением не заменяются. Проверки BUILD196: **879 passed, 0 failed**, без skip/xfail. Полный локальный прогон включает новые сценарии удалений, задержек и составов. Подключения к рабочему vMix и внешним источникам не выполнялись. ## BUILD195 — 22 октября 2026 · 2026.10.22.1 Commit: `BUILD195 — исправить HTTP 500 при применении Mapping`. - Обёртка журнала передаёт служебные параметры отправителю WebSocket. Применение конфига и ручная отправка Mapping с Agent 1.5.5 больше не падают до передачи команд. - Проверки текущего подключения, поколения и поддержки пакетной отправки остаются внутри блокировки отправителя. Запоздалый пакет не получает обход этих проверок. - Добавлена проверка HTTP-запроса применения конфига с включённым журналированием, включая публикацию, разрешение данных из БД, отправку и подтверждения Agent. Проверки BUILD195: **80 passed, 0 failed**, без skip/xfail. Проверены реальные HTTP-запросы с включённым журналом; производственные подключения не выполнялись. ## BUILD194 — 21 октября 2026 · 2026.10.21.5 Commit: `BUILD194 — Mapping по титрам, стабильное переключение матчей и счёт из БД`. - Agent 1.5.5 принимает Mapping по титрам; управление эфиром обрабатывается отдельно от массового обновления полей. Старые Agent сохраняют ограниченную пакетную передачу. - Подтверждения проверяются для каждого поля; неполная обработка явно отличается от полной. - Читаются SQL-источники действующих связей и правил; неиспользуемый источник не задерживает отправку. - Подключение, привязка и смена активности Agent используют ту же транзакцию для публикации Mapping, устраняя ожидание собственной блокировки. - Ответы предыдущего выбора матча не перезаписывают текущий матч, составы и сессию. Сохранённые составы завершённого матча читаются из БД при восстановлении выбора. - В режиме SQL нижняя панель счёта использует актуальную БД; ручные значения сохраняются отдельно. Пользовательские SQL-источники счёта проверяются отдельно для каждой стороны. - Связи встроенного счёта наследуют заданный интервал автообновления своего SQL-источника; изменение данных доходит до Mapping без повторного выбора матча. - В существующую диагностику добавлена сводка готовности выбранных матча и Agent. - Проверяются назначение, связь, структура титров, опубликованный Mapping и наличие связанных полей. - Показаны результат последней полной обработки Mapping и ожидание подтверждений устройства; неизвестное состояние не считается готовностью. - Изменение конфигурации SQL-источников снимает прежнее подтверждение; результат начатой до правки обработки не восстанавливает готовность. - Смена контекста сбрасывает прежний результат, закрытая панель не запрашивает новую сводку. - Поздняя схема титров старого WebSocket не подтверждает готовность переподключённого Agent; обработка схем одного устройства упорядочена. - Короткий Commit теперь содержит номер BUILD; порядок записан в инструкции администратора. Проверка читает сохранённое состояние и подтверждения Agent. Актуальность внешних источников и внешний вид титров в настоящем vMix проверяются отдельно. Проверки BUILD194: **807 passed, 0 failed**, без skip/xfail. В браузере пройдены 15 сценариев готовности и 11 сценариев матчей/счёта, включая 390/320 px; ошибок страницы нет. Проверки локальные, без подключения рабочей VM/vMix. Подробности: [validation.json](validation.json). ## BUILD193 — 21 октября 2026 · 2026.10.21.4 Commit: `BUILD193 — ui: увеличить шильдик версии и сохранить читаемость шапки`. - Шрифт версии увеличен с 6 до 9 px, добавлены небольшие внутренние отступы. - Колонка заголовка расширена, номер версии сохраняется в одной строке. - Следующий этап плана — сравнение загрузки на быстром и медленном ПК по существующим событиям `browser.ready` и HTTP-журналу; затем «Готовность к эфиру». Проверки: **18 passed**, в Chromium проверены 7 ширин от 320 до 1440 px. Проверка интерфейса использовала локальные тестовые ответы API; реальная VM не подключалась. ## BUILD192 — 21 октября 2026 · 2026.10.21.3 - Исправлен обрыв Mapping после трёх неудачных полей: оставшиеся титры отправляются до повторов ошибочных целей. - Возвращены пакеты до шести независимых команд с индивидуальной проверкой ACK; записи одного поля сохраняют порядок. - Ошибка отдельной HTTP-команды больше не сбрасывает состояние связи vMix; реальные отключения и смены назначения сохраняют защиту поколения. - Счётчик отправок учитывает команды с потерянным ACK; в журнале видны результат применения и ошибочные цели. - Подтверждённые пакеты сохраняют прогресс до завершения всего Mapping; последующее обновление `only_changed` пропускает их даже после прерывания запроса. - Браузер дожидается полного результата Mapping без прежнего таймаута 5/15 секунд. Одинаковые запросы объединены; при смене контекста следующим отправляется актуальный. - После изменения языка выполняется новое разрешение данных: быстрое RU → EN → RU не получает успешный ответ от старой отправки с другим языком. - Импортные операции допускаются к общему пулу БД по одной. Остальные ожидают асинхронно, сохраняя рабочие потоки для команд оператора. - Покрыты все 19 участков общей блокировки импорта, массовый импорт турниров и синхронные маршруты обновления справочников. - Сетевые запросы продолжают выполняться параллельно; разбор больших XML справочников перенесён в поток вместе с записью. - Холодная подготовка ONLINE-расписания проходит через очередь импорта; чтение расписания и проверка турнира вынесены из цикла HTTP. - Отмена ожидающего запроса не запускает импорт. Уже начавшийся worker завершает транзакцию до освобождения очереди. - В журнал добавлены длительное ожидание очереди и время выполнения импорта. Полный прогон: **641 passed, 0 failed**, без skip/xfail, 474,3 с. На локальном Mapping из 372 полей три постоянные ошибки не мешают доставке остальных 369. Подтверждены доступность записей таймера и отправки команд vMix до освобождения задержанного импорта, а также защита последнего выбора языка. Итоги, отрицательные проверки и ограничения локальных сценариев находятся в [validation.json](validation.json). Настоящий vMix и рабочая PostgreSQL не подключались. ## BUILD191 — 21 октября 2026 · 2026.10.21.2 - Пустой выбор Agent больше не отправляет команды таймера на прежнее устройство сессии. - Сервер отклоняет явно пустой `device_id`; старые клиенты без этого поля проходят прежние проверки доступа. - Неотправленные назначения удалений удаляются из оптимистичного кэша, локальный таймер сохраняет своё состояние. - Устаревшие проверки GUID/номеров Inputs, пакетного транспорта и противоречивых протоколов таймеров заменены исполняемыми проверками действующих контрактов. - Проверки КХЛ используют отдельные настройки: выбор числа потоков на VM не меняется ради тестов. - Проверяются порядок ACK, ограниченные повторы, изоляция устройств, пауза/продолжение native Countdown, готовые удаления, права и переключение матчей. - Проверки JavaScript требуют явного завершения сценария: завершение Node с незавершённым Promise не считается успехом. Полный прогон: **565 passed, 0 failed**, без skip/xfail, 272,9 с. Для всех 59 прежних падений проверено соответствие реально прошедшим сценариям. Все 11 намеренно внесённых ошибочных вариантов обнаружены проверками. Совместный локальный прогон трёх матчей и шести Agents: 60 циклов по 64 поля, 24 196 команд и 1425 запросов зрителей. Итоговые значения, изоляция, восстановление после ошибок ACK/разрыва и передача управления прошли; очереди завершились пустыми. Подробные результаты и ограничения находятся в [validation.json](validation.json). Живые PostgreSQL, Stat2TV, Windows Agent.exe и vMix в локальном прогоне не подключались. ## BUILD190 — 21 октября 2026 · 2026.10.21.1 - Mapping кэшируется только после ACK; ограниченные безопасные повторы и защита от старых подтверждений. - Чтение Agent, heartbeat и восстановление разделены; новый WebSocket ждёт inventory. - Восстановление связи сохраняет поля работающих native Countdown. - Опубликованная версия Mapping закреплена за Agent; правки шаблона не переключают остальные эфиры. - Атомарное сохранение Mapping с проверкой версии; опубликованные снимки переживают удаление шаблона. - Усилена проверка участника/матча/устройства; зритель может иметь свой отдельный выход. - Добавлен постоянный журнал, кнопка «Журнал», лёгкая страница /logs, фильтры и TXT/JSONL. - Текущий и предыдущий московские месяцы журналов, автоматическая очистка; секреты маскируются. - Сжатие и кэширование версионных ресурсов, параллельный старт, меньше работы редактора в runtime. - Добавлены замеры загрузки/отрисовки браузера и Server-Timing для HTTP. - Повторные XML используют один путь по SHA-256; история путей PostgreSQL сохраняется. - Старые одинаковые XML можно объединить hardlink без удаления имён файлов. - Ограничено хранение standalone discovery-отчётов; XML по возрасту не удаляются. - HTTP-клиенты Stat2TV переиспользуют пул соединений и закрываются при завершении. - Одинаковое сохранение UI не создаёт backup и не перезаписывает конфигурацию. - История старых backup импортируется однократно и не возвращается на каждом старте. - Добавлена консервативная очистка VM с предварительным планом по умолчанию. - Основная документация сведена к README и четырём документам; deploy имеет один источник. Проверки выполнялись без доступа к рабочим PostgreSQL/Stat2TV/vMix: SQLite-фикстуры, поддельные Agent/ACK и Chromium с локальными API. В контролируемом сценарии без выбранного матча, с задержкой начальных API 150 мс, медиана трёх запусков снизилась с 3477 до 1424 мс. Это не измерение производственного сервера или ёмкости матчей. Итоги проверок и идентификаторы 59 падений, уже присутствовавших в исходном архиве, сохранены в [validation.json](validation.json). Финальный поведенческий набор — 91 passed; дополнительные проверки входа с телефона и выхода при недоступной авторизации также прошли. Полный набор после последних правок повторно не запускался. ## Последняя исходная сборка BUILD189 / `2026.10.02.9`: снижение повторных SQL-запросов и нагрузки двух матчей, оптимизация браузерных обновлений и работы второго Agent. BUILD188 восстановил вызов удаления при верхнем счёте и сохранение действующего удаления при снятии Delay Penalty. BUILD180–184 развивали контекст штрафа, SQL, Preview через триггер, общую ссылку «Своих плюсов» и подготовленные титры. Предшествующие обновления включали роли оператора/зрителя, атомарные настройки UI, карьеру КХЛ, аналитику, переносимый mapping и native Countdown. ## Архив прежних инструкций [history.zip](history.zip) содержит исходные README/UPDATE/VALIDATION и manifests, включая разбор прежних 40 падений тестов. Это исторические документы для сравнения и восстановления, их команды установки относятся к указанным в них сборкам. Текущие инструкции находятся в README, OPERATOR, ADMIN и ARCHITECTURE. Исходные рабочие данные и credentials в архив истории не включены.