test_golden.py::test_two_runs_are_identical — флаки: два прогона с одним seed периодически дают разные журналы #5

Open
opened 2026-08-09 19:34:18 +05:00 by geekiot · 0 comments
Owner

Симптом

Тест services/game-core/tests/test_golden.py::TestGoldenFullSession::test_two_runs_are_identical
(DoD TASK-31, D-51: два прогона с одним seed дают идентичные журналы)
периодически падает в полном прогоне uv run pytest -q. Изолированно
(pytest services/game-core/tests/test_golden.py) и при повторном запуске —
стабильно зелёный.

Зафиксированные проявления:

  • этап E4 (зрительское api), однократно — см. handoff E4→E5;
  • этап E5, TASK-46 (2026-08-09, ветка feat/ui-frontend-e5), однократно
    в полном прогоне; следующие 3 полных прогона и изолированные запуски — зелёные.

Почему это важно

Детерминизм по seed — основа тестовой стратегии game-core (OPEN-7) и
воспроизводимости сессий (reliability.md §Тестирование). Если журналы двух
прогонов расходятся, где-то есть источник недетерминизма — тест по замыслу
ловит именно его, и «флаки» может быть симптомом реального дефекта, а не
проблемой теста.

Что проверить (гипотезы источников недетерминизма)

  • порядок итерации по неупорядоченным структурам (set/dict) в game-core;
  • зависимость от wall-clock вне нормализации ts (ветвления по времени);
  • конкурентность asyncio: порядок завершения корутин, общее mutable-состояние;
  • ScriptedResponder: порядок/избирательность сопоставления ответов;
  • SeededRandom: место, где случайно используется глобальный random вместо seeded;
  • влияние полного прогона: общая БД/порядок тестов (изолированно тест зелёный) —
    проверить утечки состояния между тестами.

Как воспроизводить

Прогонять полный набор в цикле до падения, например:
for i in $(seq 1 20); do uv run pytest -q || break; done
(тестовая БД: docker compose up -d postgres, DATABASE_URL на 127.0.0.1).
При падении — сохранить diff двух нормализованных журналов (сейчас тест
сравнивает строки целиком и diff не показывает; стоит добавить вывод
первого расходящегося события в assertion message — это упростит диагностику).

Критерий закрытия

  • Источник недетерминизма найден и устранён (или доказано, что дефект в самом
    тесте/харнессе — тогда исправлен харнес).
  • 20+ последовательных полных прогонов uv run pytest -q зелёные.
## Симптом Тест `services/game-core/tests/test_golden.py::TestGoldenFullSession::test_two_runs_are_identical` (DoD TASK-31, D-51: два прогона с одним seed дают идентичные журналы) периодически падает в полном прогоне `uv run pytest -q`. Изолированно (`pytest services/game-core/tests/test_golden.py`) и при повторном запуске — стабильно зелёный. Зафиксированные проявления: - этап E4 (зрительское api), однократно — см. handoff E4→E5; - этап E5, TASK-46 (2026-08-09, ветка feat/ui-frontend-e5), однократно в полном прогоне; следующие 3 полных прогона и изолированные запуски — зелёные. ## Почему это важно Детерминизм по seed — основа тестовой стратегии game-core (OPEN-7) и воспроизводимости сессий (reliability.md §Тестирование). Если журналы двух прогонов расходятся, где-то есть источник недетерминизма — тест по замыслу ловит именно его, и «флаки» может быть симптомом реального дефекта, а не проблемой теста. ## Что проверить (гипотезы источников недетерминизма) - порядок итерации по неупорядоченным структурам (set/dict) в game-core; - зависимость от wall-clock вне нормализации `ts` (ветвления по времени); - конкурентность asyncio: порядок завершения корутин, общее mutable-состояние; - ScriptedResponder: порядок/избирательность сопоставления ответов; - SeededRandom: место, где случайно используется глобальный random вместо seeded; - влияние полного прогона: общая БД/порядок тестов (изолированно тест зелёный) — проверить утечки состояния между тестами. ## Как воспроизводить Прогонять полный набор в цикле до падения, например: `for i in $(seq 1 20); do uv run pytest -q || break; done` (тестовая БД: `docker compose up -d postgres`, `DATABASE_URL` на 127.0.0.1). При падении — сохранить diff двух нормализованных журналов (сейчас тест сравнивает строки целиком и diff не показывает; стоит добавить вывод первого расходящегося события в assertion message — это упростит диагностику). ## Критерий закрытия - Источник недетерминизма найден и устранён (или доказано, что дефект в самом тесте/харнессе — тогда исправлен харнес). - 20+ последовательных полных прогонов `uv run pytest -q` зелёные.
geekiot added reference main 2026-08-09 19:35:35 +05:00
geekiot self-assigned this 2026-08-09 19:35:54 +05:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
geekiot/mafia-agents#5
No description provided.