Files
hockey_new/PREVIOUS_40_FAILURES_RU.md
2026-09-26 23:18:54 +03:00

16 KiB
Raw Blame History

Что означают 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 проверок

Пути ниже относятся к каталогу проекта; приведена причина конкретного падения, а не обещание полной исправности соответствующего раздела.

  1. tests/test_build101_simple_timer_runtime.py::test_timer_start_stop_protocol_is_minimal

    Ищет старую запись ветки stop/pause в vmixCountdownSyncCommands, а рабочие переходы вынесены в vmixGameCountdownControlCommands.

  2. 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 и передаёт команды отдельными упорядоченными кадрами.

  3. tests/test_build103_space_timer_fast_transport.py::test_timer_fast_contract_and_build_version

    Требует точное сравнение fast_timer = delivery_mode == "timer-fast"; сейчас принимаются оба режима, включая timer-fast-ordered.

  4. tests/test_build104_timer_stop_no_rollback.py::test_pause_stop_sends_only_pause_only_command

    Разрезает текст старого helper по прежнему if; разделитель отсутствует, возникает IndexError вместо проверки действующей паузы.

  5. tests/test_build104_timer_stop_no_rollback.py::test_explicit_edit_still_can_seed_stopped_clock

    Извлекает ветку set из старого vmixCountdownSyncCommands. Действующая установка времени выполняется другим helper.

  6. tests/test_build104_timer_stop_no_rollback.py::test_penalty_pause_preserves_native_vmix_frozen_value

    Ищет старое условие preservePausedCountdown/assignmentChanged. Переход теперь выбирается по назначению, running и явной правке.

  7. tests/test_build105_suspend_countdown_pause.py::test_space_pause_uses_suspend_not_stop_reset

    Как BUILD104, разрезает текст по прежней записи if. IndexError не является выполнением Countdown.

  8. tests/test_build105_suspend_countdown_pause.py::test_explicit_reset_set_path_keeps_stop_then_set

    Требует старый порядок Stop → Set в старом helper. Текущая явная установка использует Set → Stop.

  9. tests/test_build105_suspend_countdown_pause.py::test_penalty_normal_pause_uses_suspend

    Ищет прежний текст условия сохранения паузы; текущая машина переходов хранит running в назначении Input.

  10. tests/test_build106_runtime_authoritative_timer.py::test_countdown_start_hard_reseeds_before_start

Сравнивает позиции StopCountdown и SetCountdown в широком фрагменте текста, захватывающем несколько helper. Не исполняет отправку.

  1. tests/test_build106_runtime_authoritative_timer.py::test_pause_is_reseeded_from_runtime_not_native_clock

Ожидает старую ветку, которая переустанавливала время на каждой паузе. Текущая пауза сохраняет собственное положение vMix.

  1. tests/test_build106_runtime_authoritative_timer.py::test_scoreboard_show_syncs_timer_before_overlay_steps

Требует ветку timerState.running ? "start" : "set" при показе титра. Сейчас показ не перезапускает уже работающий игровой счётчик.

  1. tests/test_build106_runtime_authoritative_timer.py::test_build106_version

Требует буквальную версию 2026.08.24.9. Это проверка прежнего номера сборки.

  1. tests/test_build107_pause_change_countdown.py::test_start_uses_change_then_start_without_stop_or_set_duration

Извлекает широкий текст от комментария старого helper и запрещает StopCountdown во всём остатке. Захватывает другие допустимые ветки.

  1. tests/test_build107_pause_change_countdown.py::test_runtime_version

Требует буквальную версию 2026.08.24.10. Это проверка прежнего номера сборки.

  1. tests/test_build108_native_pause_no_resync.py::test_game_clock_helper_only_seeds_on_set

Требует PauseCountdown. Текущая пауза использует SuspendCountdown — команду паузы без сброса.

  1. tests/test_build108_native_pause_no_resync.py::test_explicit_time_change_seeds_even_before_first_space

Требует буквальный вызов helper(..., "set"). Теперь выбор зависит от running: set или set_running.

  1. tests/test_build110_match_roster_atomic_switch.py::test_selected_game_cache_is_match_scoped_and_local

Ищет имя cachedRostersReady в tournament-menu.js; оно отсутствует в текущем процессе открытия матча.

  1. tests/test_build110_match_roster_atomic_switch.py::test_first_time_match_waits_for_core_roster_before_polling

Ищет старую ветку if (!manual && !cachedRostersReady). Это поиск текста, а не проверка полученного состава.

  1. tests/test_build111_agent_match_handoff.py::test_mapping_is_refreshed_only_after_roster_enrichment

Через index ищет ту же удалённую ветку cachedRostersReady, поэтому не доходит до проверки порядка обновления Mapping.

  1. 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". Изменение диагностической строки не исполняет обновление состава.

  1. tests/test_build56_trigger_save_onair.py::test_quick_panel_on_air_tracking_has_ack_confirmed_fallback

Требует регулярное выражение OverlayInput([1-4]); текущий парсер поддерживает каналы 1–8.

  1. tests/test_build59_toasts_and_adaptive_runtime.py::test_runtime_can_grow_in_f11_and_large_viewports

Требует прежние константы масштабирования maxScale 1.6/1.8. Не измеряет фактический размер или доступность интерфейса.

  1. tests/test_build62_quick_panel_onair_reconcile.py::test_overlay_parser_accepts_legacy_function_strings

Повторно требует диапазон OverlayInput([1-4]); текущая поддержка расширена до 1–8.

  1. 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. Текущий интерфейс формирует вкладки иначе.

  1. tests/test_build93_countdown_reseed_on_start.py::test_game_countdown_resume_is_reseeded_before_start

Требует объединённую ветку start/restart/resume. Сейчас новый старт и продолжение разделены, чтобы пауза не давала скачок.

  1. tests/test_build93_countdown_reseed_on_start.py::test_hockey_timer_shortcut_reseeds_game_and_penalty_on_resume

Считает вызовы старого vmixCountdownSyncCommands. Рабочие игровые/штрафные переходы используют другие helper.

  1. tests/test_build93_countdown_reseed_on_start.py::test_native_mode_still_has_no_per_second_countdown_transport

Ищет прежний текстовый mirror на timer_tick. Нативные Countdown не требуют такого посекундного зеркала.

  1. tests/test_build95_countdown_explicit_start_stop_sync.py::test_main_countdown_start_pause_stop_all_hard_sync_web_value

Требует вызов старого vmixCountdownSyncCommands для старта/паузы/остановки; рабочий helper заменён.

  1. tests/test_build95_countdown_explicit_start_stop_sync.py::test_combined_shortcut_changes_web_first_then_synchronizes_vmix

Требует присутствие старого helper в обработчике пробела. Порядок локального изменения и доставки нужно проверять поведением.

  1. 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.

  1. tests/test_build97_mapping_chunked_transport.py::test_mapping_transport_splits_timeout_batch_and_keeps_going

Подменяет пакетную отправку и ждёт дробление timeout-пакета 35 → ≤10 команд с повторами. В текущем последовательном режиме такого алгоритма нет; WebSocket не подключён.

  1. tests/test_build97_mapping_chunked_transport.py::test_mapping_transport_retries_isolated_failed_command

Подменяет прежние batch/single методы и ждёт повтор одного ошибочного элемента. Текущий путь использует send без этих повторов и без подключённого WebSocket.

  1. tests/test_build97_mapping_chunked_transport.py::test_build97_runtime_version_and_mapping_diagnostics

Требует диагностическую метку chunked_batch/legacy; действующая метка — sequential_no_ack.

  1. tests/test_build98_timer_countdown_sync_fixed_pin.py::test_countdown_start_is_simple_set_start

Запрещает SuspendCountdown в слишком широком извлечённом фрагменте, захватывающем ветку паузы другого helper.

  1. tests/test_build98_timer_countdown_sync_fixed_pin.py::test_pause_and_stop_freeze_without_reseed

Через split ищет старую запись stop/pause, получает IndexError до какого-либо исполнения таймера.

  1. tests/test_mapping_admin_visibility.py::test_mapping_has_series_autolink_and_visible_sql_table_grid

Ищет переменную tableGridHeight в admin-directories.js. Это привязка к прежней реализации сетки, а не проверка самой таблицы.

  1. tests/test_shortcut_sequences.py::test_hockey_timer_shortcut_supports_native_countdown_and_legacy_text_mirror

Запрещает SuspendCountdown во всём app.js, хотя эта команда нужна для текущей паузы без сброса.

  1. tests/test_shortcut_sequences.py::test_overlay_group_repeat_uses_transition_out_not_all_off

Требует литералы OverlayInput1Out и т. д.; текущий код генерирует команды шаблоном для выбранных каналов.

  1. 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 под прямо запрошенное поведение готового удаления; его исполнение дополнительно покрыто новыми тестами.