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

186 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Что означают 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. Не исполняет отправку.
11. `tests/test_build106_runtime_authoritative_timer.py::test_pause_is_reseeded_from_runtime_not_native_clock`
Ожидает старую ветку, которая переустанавливала время на каждой паузе. Текущая пауза сохраняет собственное положение vMix.
12. `tests/test_build106_runtime_authoritative_timer.py::test_scoreboard_show_syncs_timer_before_overlay_steps`
Требует ветку timerState.running ? "start" : "set" при показе титра. Сейчас показ не перезапускает уже работающий игровой счётчик.
13. `tests/test_build106_runtime_authoritative_timer.py::test_build106_version`
Требует буквальную версию 2026.08.24.9. Это проверка прежнего номера сборки.
14. `tests/test_build107_pause_change_countdown.py::test_start_uses_change_then_start_without_stop_or_set_duration`
Извлекает широкий текст от комментария старого helper и запрещает StopCountdown во всём остатке. Захватывает другие допустимые ветки.
15. `tests/test_build107_pause_change_countdown.py::test_runtime_version`
Требует буквальную версию 2026.08.24.10. Это проверка прежнего номера сборки.
16. `tests/test_build108_native_pause_no_resync.py::test_game_clock_helper_only_seeds_on_set`
Требует PauseCountdown. Текущая пауза использует SuspendCountdown — команду паузы без сброса.
17. `tests/test_build108_native_pause_no_resync.py::test_explicit_time_change_seeds_even_before_first_space`
Требует буквальный вызов helper(..., "set"). Теперь выбор зависит от running: set или set_running.
18. `tests/test_build110_match_roster_atomic_switch.py::test_selected_game_cache_is_match_scoped_and_local`
Ищет имя cachedRostersReady в tournament-menu.js; оно отсутствует в текущем процессе открытия матча.
19. `tests/test_build110_match_roster_atomic_switch.py::test_first_time_match_waits_for_core_roster_before_polling`
Ищет старую ветку if (!manual && !cachedRostersReady). Это поиск текста, а не проверка полученного состава.
20. `tests/test_build111_agent_match_handoff.py::test_mapping_is_refreshed_only_after_roster_enrichment`
Через index ищет ту же удалённую ветку cachedRostersReady, поэтому не доходит до проверки порядка обновления Mapping.
21. `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". Изменение диагностической строки не исполняет обновление состава.
22. `tests/test_build56_trigger_save_onair.py::test_quick_panel_on_air_tracking_has_ack_confirmed_fallback`
Требует регулярное выражение OverlayInput([1-4]); текущий парсер поддерживает каналы 1–8.
23. `tests/test_build59_toasts_and_adaptive_runtime.py::test_runtime_can_grow_in_f11_and_large_viewports`
Требует прежние константы масштабирования maxScale 1.6/1.8. Не измеряет фактический размер или доступность интерфейса.
24. `tests/test_build62_quick_panel_onair_reconcile.py::test_overlay_parser_accepts_legacy_function_strings`
Повторно требует диапазон OverlayInput([1-4]); текущая поддержка расширена до 1–8.
25. `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. Текущий интерфейс формирует вкладки иначе.
26. `tests/test_build93_countdown_reseed_on_start.py::test_game_countdown_resume_is_reseeded_before_start`
Требует объединённую ветку start/restart/resume. Сейчас новый старт и продолжение разделены, чтобы пауза не давала скачок.
27. `tests/test_build93_countdown_reseed_on_start.py::test_hockey_timer_shortcut_reseeds_game_and_penalty_on_resume`
Считает вызовы старого vmixCountdownSyncCommands. Рабочие игровые/штрафные переходы используют другие helper.
28. `tests/test_build93_countdown_reseed_on_start.py::test_native_mode_still_has_no_per_second_countdown_transport`
Ищет прежний текстовый mirror на timer_tick. Нативные Countdown не требуют такого посекундного зеркала.
29. `tests/test_build95_countdown_explicit_start_stop_sync.py::test_main_countdown_start_pause_stop_all_hard_sync_web_value`
Требует вызов старого vmixCountdownSyncCommands для старта/паузы/остановки; рабочий helper заменён.
30. `tests/test_build95_countdown_explicit_start_stop_sync.py::test_combined_shortcut_changes_web_first_then_synchronizes_vmix`
Требует присутствие старого helper в обработчике пробела. Порядок локального изменения и доставки нужно проверять поведением.
31. `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.
32. `tests/test_build97_mapping_chunked_transport.py::test_mapping_transport_splits_timeout_batch_and_keeps_going`
Подменяет пакетную отправку и ждёт дробление timeout-пакета 35 → ≤10 команд с повторами. В текущем последовательном режиме такого алгоритма нет; WebSocket не подключён.
33. `tests/test_build97_mapping_chunked_transport.py::test_mapping_transport_retries_isolated_failed_command`
Подменяет прежние batch/single методы и ждёт повтор одного ошибочного элемента. Текущий путь использует send без этих повторов и без подключённого WebSocket.
34. `tests/test_build97_mapping_chunked_transport.py::test_build97_runtime_version_and_mapping_diagnostics`
Требует диагностическую метку chunked_batch/legacy; действующая метка — sequential_no_ack.
35. `tests/test_build98_timer_countdown_sync_fixed_pin.py::test_countdown_start_is_simple_set_start`
Запрещает SuspendCountdown в слишком широком извлечённом фрагменте, захватывающем ветку паузы другого helper.
36. `tests/test_build98_timer_countdown_sync_fixed_pin.py::test_pause_and_stop_freeze_without_reseed`
Через split ищет старую запись stop/pause, получает IndexError до какого-либо исполнения таймера.
37. `tests/test_mapping_admin_visibility.py::test_mapping_has_series_autolink_and_visible_sql_table_grid`
Ищет переменную tableGridHeight в admin-directories.js. Это привязка к прежней реализации сетки, а не проверка самой таблицы.
38. `tests/test_shortcut_sequences.py::test_hockey_timer_shortcut_supports_native_countdown_and_legacy_text_mirror`
Запрещает SuspendCountdown во всём app.js, хотя эта команда нужна для текущей паузы без сброса.
39. `tests/test_shortcut_sequences.py::test_overlay_group_repeat_uses_transition_out_not_all_off`
Требует литералы OverlayInput1Out и т. д.; текущий код генерирует команды шаблоном для выбранных каналов.
40. `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 под прямо запрошенное поведение готового удаления; его исполнение дополнительно покрыто новыми тестами.