16 KiB
Что означают 40 прежних падений
Это 40 неуспешных автоматических тестов, а не 40 зарегистрированных падений сервера во время матча. Они уже были в журнале первого этапа и сохранились во втором этапе. Здесь разобран конкретный журнал второго этапа: 409 passed, 40 failed.
37 тестов проверяют текст исходников, имена helper/переменных или номера старых сборок. 3 исполняют старый сценарий пакетной отправки Mapping с подменой методов, которые текущий путь больше не вызывает. Часть требований к таймерам противоречит друг другу: одни требуют переустановку на Resume, другие её запрещают; одни требуют PauseCountdown, другие SuspendCountdown.
Это не доказывает отсутствия дефектов в затронутых функциях. Например, старое время удаления было настоящим дефектом, который эти проверки не воспроизводили: прежний тест проверял список команд, но не различал длительность и текущее положение нативного счётчика.
Mapping: что действительно проверено
Текущий BUILD113 использует последовательные vmix.command через WebSocket, без ожидания ACK. Три BUILD97 теста подключают подставные send_vmix_batch/send_vmix_command, но не живой WebSocket для send. В журнале всех трёх есть предупреждение об отсутствующем WebSocket, после чего падает assert all(...ok...).
В новом исправлении добавлены отдельные тесты нынешнего пути: 372 команды проходят в правильном порядке только одному Agent; при обрыве отправка хвоста прекращается с ошибкой; при недоставленном назначении матча поля не отправляются. Автоматические повторы старого batch-протокола не восстановлены.
Реальное ограничение: успех отправки означает доставку WebSocket кадра, а не подтверждённое выполнение vMix. Ошибка функции, имени поля или Input может возникнуть уже на стороне Agent/vMix. Безопасное улучшение на будущее — неблокирующая сверка ACK/состояния и диагностика, без задержки локальных часов и без слепого повтора toggle-команд.
Все 40 проверок
Пути ниже относятся к каталогу проекта; приведена причина конкретного падения, а не обещание полной исправности соответствующего раздела.
-
tests/test_build101_simple_timer_runtime.py::test_timer_start_stop_protocol_is_minimalИщет старую запись ветки stop/pause в vmixCountdownSyncCommands, а рабочие переходы вынесены в vmixGameCountdownControlCommands.
-
tests/test_build103_space_timer_fast_transport.py::test_space_edge_is_single_fire_and_local_timer_changes_before_transportТребует строку delivery_mode: "timer-fast". Текущий режим называется timer-fast-ordered и передаёт команды отдельными упорядоченными кадрами.
-
tests/test_build103_space_timer_fast_transport.py::test_timer_fast_contract_and_build_versionТребует точное сравнение fast_timer = delivery_mode == "timer-fast"; сейчас принимаются оба режима, включая timer-fast-ordered.
-
tests/test_build104_timer_stop_no_rollback.py::test_pause_stop_sends_only_pause_only_commandРазрезает текст старого helper по прежнему if; разделитель отсутствует, возникает IndexError вместо проверки действующей паузы.
-
tests/test_build104_timer_stop_no_rollback.py::test_explicit_edit_still_can_seed_stopped_clockИзвлекает ветку set из старого vmixCountdownSyncCommands. Действующая установка времени выполняется другим helper.
-
tests/test_build104_timer_stop_no_rollback.py::test_penalty_pause_preserves_native_vmix_frozen_valueИщет старое условие preservePausedCountdown/assignmentChanged. Переход теперь выбирается по назначению, running и явной правке.
-
tests/test_build105_suspend_countdown_pause.py::test_space_pause_uses_suspend_not_stop_resetКак BUILD104, разрезает текст по прежней записи if. IndexError не является выполнением Countdown.
-
tests/test_build105_suspend_countdown_pause.py::test_explicit_reset_set_path_keeps_stop_then_setТребует старый порядок Stop → Set в старом helper. Текущая явная установка использует Set → Stop.
-
tests/test_build105_suspend_countdown_pause.py::test_penalty_normal_pause_uses_suspendИщет прежний текст условия сохранения паузы; текущая машина переходов хранит running в назначении Input.
-
tests/test_build106_runtime_authoritative_timer.py::test_countdown_start_hard_reseeds_before_start
Сравнивает позиции StopCountdown и SetCountdown в широком фрагменте текста, захватывающем несколько helper. Не исполняет отправку.
tests/test_build106_runtime_authoritative_timer.py::test_pause_is_reseeded_from_runtime_not_native_clock
Ожидает старую ветку, которая переустанавливала время на каждой паузе. Текущая пауза сохраняет собственное положение vMix.
tests/test_build106_runtime_authoritative_timer.py::test_scoreboard_show_syncs_timer_before_overlay_steps
Требует ветку timerState.running ? "start" : "set" при показе титра. Сейчас показ не перезапускает уже работающий игровой счётчик.
tests/test_build106_runtime_authoritative_timer.py::test_build106_version
Требует буквальную версию 2026.08.24.9. Это проверка прежнего номера сборки.
tests/test_build107_pause_change_countdown.py::test_start_uses_change_then_start_without_stop_or_set_duration
Извлекает широкий текст от комментария старого helper и запрещает StopCountdown во всём остатке. Захватывает другие допустимые ветки.
tests/test_build107_pause_change_countdown.py::test_runtime_version
Требует буквальную версию 2026.08.24.10. Это проверка прежнего номера сборки.
tests/test_build108_native_pause_no_resync.py::test_game_clock_helper_only_seeds_on_set
Требует PauseCountdown. Текущая пауза использует SuspendCountdown — команду паузы без сброса.
tests/test_build108_native_pause_no_resync.py::test_explicit_time_change_seeds_even_before_first_space
Требует буквальный вызов helper(..., "set"). Теперь выбор зависит от running: set или set_running.
tests/test_build110_match_roster_atomic_switch.py::test_selected_game_cache_is_match_scoped_and_local
Ищет имя cachedRostersReady в tournament-menu.js; оно отсутствует в текущем процессе открытия матча.
tests/test_build110_match_roster_atomic_switch.py::test_first_time_match_waits_for_core_roster_before_polling
Ищет старую ветку if (!manual && !cachedRostersReady). Это поиск текста, а не проверка полученного состава.
tests/test_build111_agent_match_handoff.py::test_mapping_is_refreshed_only_after_roster_enrichment
Через index ищет ту же удалённую ветку cachedRostersReady, поэтому не доходит до проверки порядка обновления Mapping.
tests/test_build44_strength_vmix_sync.py::test_runtime_refreshes_only_changed_mapping_when_strength_changes
Требует прежнее выражение reason="runtime_strength_changed" if only_changed else "manual_apply". Изменение диагностической строки не исполняет обновление состава.
tests/test_build56_trigger_save_onair.py::test_quick_panel_on_air_tracking_has_ack_confirmed_fallback
Требует регулярное выражение OverlayInput([1-4]); текущий парсер поддерживает каналы 1–8.
tests/test_build59_toasts_and_adaptive_runtime.py::test_runtime_can_grow_in_f11_and_large_viewports
Требует прежние константы масштабирования maxScale 1.6/1.8. Не измеряет фактический размер или доступность интерфейса.
tests/test_build62_quick_panel_onair_reconcile.py::test_overlay_parser_accepts_legacy_function_strings
Повторно требует диапазон OverlayInput([1-4]); текущая поддержка расширена до 1–8.
tests/test_build86_penalty_context_prepared_titles.py::test_prepared_titles_is_forced_to_last_runtime_tab_and_uses_hockey_api_directly
Требует точную строку перестановки prepared_titles через filter. Текущий интерфейс формирует вкладки иначе.
tests/test_build93_countdown_reseed_on_start.py::test_game_countdown_resume_is_reseeded_before_start
Требует объединённую ветку start/restart/resume. Сейчас новый старт и продолжение разделены, чтобы пауза не давала скачок.
tests/test_build93_countdown_reseed_on_start.py::test_hockey_timer_shortcut_reseeds_game_and_penalty_on_resume
Считает вызовы старого vmixCountdownSyncCommands. Рабочие игровые/штрафные переходы используют другие helper.
tests/test_build93_countdown_reseed_on_start.py::test_native_mode_still_has_no_per_second_countdown_transport
Ищет прежний текстовый mirror на timer_tick. Нативные Countdown не требуют такого посекундного зеркала.
tests/test_build95_countdown_explicit_start_stop_sync.py::test_main_countdown_start_pause_stop_all_hard_sync_web_value
Требует вызов старого vmixCountdownSyncCommands для старта/паузы/остановки; рабочий helper заменён.
tests/test_build95_countdown_explicit_start_stop_sync.py::test_combined_shortcut_changes_web_first_then_synchronizes_vmix
Требует присутствие старого helper в обработчике пробела. Порядок локального изменения и доставки нужно проверять поведением.
tests/test_build97_mapping_chunked_transport.py::test_mapping_chunk_transport_sends_300_plus_links_in_small_batches
Подменяет send_vmix_batch и ждёт 372 команды в 12 пакетах. Текущий код вызывает send/vmix.command, а WebSocket тест не подключает; результат закономерно offline.
tests/test_build97_mapping_chunked_transport.py::test_mapping_transport_splits_timeout_batch_and_keeps_going
Подменяет пакетную отправку и ждёт дробление timeout-пакета 35 → ≤10 команд с повторами. В текущем последовательном режиме такого алгоритма нет; WebSocket не подключён.
tests/test_build97_mapping_chunked_transport.py::test_mapping_transport_retries_isolated_failed_command
Подменяет прежние batch/single методы и ждёт повтор одного ошибочного элемента. Текущий путь использует send без этих повторов и без подключённого WebSocket.
tests/test_build97_mapping_chunked_transport.py::test_build97_runtime_version_and_mapping_diagnostics
Требует диагностическую метку chunked_batch/legacy; действующая метка — sequential_no_ack.
tests/test_build98_timer_countdown_sync_fixed_pin.py::test_countdown_start_is_simple_set_start
Запрещает SuspendCountdown в слишком широком извлечённом фрагменте, захватывающем ветку паузы другого helper.
tests/test_build98_timer_countdown_sync_fixed_pin.py::test_pause_and_stop_freeze_without_reseed
Через split ищет старую запись stop/pause, получает IndexError до какого-либо исполнения таймера.
tests/test_mapping_admin_visibility.py::test_mapping_has_series_autolink_and_visible_sql_table_grid
Ищет переменную tableGridHeight в admin-directories.js. Это привязка к прежней реализации сетки, а не проверка самой таблицы.
tests/test_shortcut_sequences.py::test_hockey_timer_shortcut_supports_native_countdown_and_legacy_text_mirror
Запрещает SuspendCountdown во всём app.js, хотя эта команда нужна для текущей паузы без сброса.
tests/test_shortcut_sequences.py::test_overlay_group_repeat_uses_transition_out_not_all_off
Требует литералы OverlayInput1Out и т. д.; текущий код генерирует команды шаблоном для выбранных каналов.
tests/test_shortcut_sequences.py::test_build90_native_countdown_avoids_per_second_transport
Требует условие step.penalty_vmix_mode === "countdown". Текущая синхронизация удалений использует нативный Countdown всегда.
Что осталось сделать с набором тестов
Согласовать актуальные правила для основного таймера, удалений, Mapping и открытия матча, затем заменить проверки старых строк на исполнение сценариев. В частности: реальный результат паузы/продолжения, положение переиспользованного Countdown, порядок кадров, поведение при offline/ошибке, отображение составов и работа Overlay 1–8. Старые версии сборок не должны быть обязательным содержимым текущего app.py.
В этой поставке все прежние 40 тестов оставлены и по-прежнему видны как failed. Итог нового полного прогона: 421 passed, 40 failed, без новых падающих идентификаторов. Изменены только три другие текстовые проверки BUILD77/BUILD95 под прямо запрошенное поведение готового удаления; его исполнение дополнительно покрыто новыми тестами.