С #80 рейтинг у игрока один на всё приложение, и он — функция упорядоченной истории. Любое завершение, правка или удаление партии меняет:
общий топ и главную — у всех;
рейтинг, а в истории rating_delta — у всех, кто играл после этой партии (правка прошлой партии пересчитывает всё после неё);
рейтинг игроков на страницах других групп, где они состоят.
SSE-инвалидация спроектирована под старый групповой рейтинг:
notify.match_changed / match_removed (backend/app/services/notify.py:30-69) шлют событие только участникам группы партии;
useServerEvents.ts:58-67 инвалидирует историю и профиль только участников этой партии; страницы групп — только группы партии.
Комментарий там же «Общее меняется от любой партии: рейтинг глобальный» верен, но до игроков вне группы событие не доходит вовсе.
Сценарий
Игрок X состоит в группах A и B. У зрителя Z (только в B) открыта страница группы B или общий топ.
В группе A завершают партию с X.
У Z рейтинг X не обновляется, пока вкладка не получит фокус или не будет открыта заново. Так же не обновляется история и профиль Y, сыгравшего после правленой партии.
Данные не портятся — отстаёт только живое обновление.
Что сделать
Событие о партии отправлять всем активным игрокам (как announcements_changed), а не только группе.
На фронте по событию match инвалидировать рейтинговые витрины целиком: топ, главную, свою статистику, все истории, профили и статистику групп. TanStack Query перезапрашивает только смонтированные запросы, остальные лишь помечает устаревшими, так что широкая инвалидация дешёвая.
## Проблема
С #80 рейтинг у игрока один на всё приложение, и он — функция упорядоченной истории. Любое завершение, правка или удаление партии меняет:
- общий топ и главную — у всех;
- рейтинг, а в истории `rating_delta` — у всех, кто играл **после** этой партии (правка прошлой партии пересчитывает всё после неё);
- рейтинг игроков на страницах **других** групп, где они состоят.
SSE-инвалидация спроектирована под старый групповой рейтинг:
- `notify.match_changed` / `match_removed` (`backend/app/services/notify.py:30-69`) шлют событие только участникам группы партии;
- `useServerEvents.ts:58-67` инвалидирует историю и профиль только участников этой партии; страницы групп — только группы партии.
Комментарий там же «Общее меняется от любой партии: рейтинг глобальный» верен, но до игроков вне группы событие не доходит вовсе.
## Сценарий
1. Игрок X состоит в группах A и B. У зрителя Z (только в B) открыта страница группы B или общий топ.
2. В группе A завершают партию с X.
3. У Z рейтинг X не обновляется, пока вкладка не получит фокус или не будет открыта заново. Так же не обновляется история и профиль Y, сыгравшего после правленой партии.
Данные не портятся — отстаёт только живое обновление.
## Что сделать
- [ ] Событие о партии отправлять всем активным игрокам (как `announcements_changed`), а не только группе.
- [ ] На фронте по событию `match` инвалидировать рейтинговые витрины целиком: топ, главную, свою статистику, все истории, профили и статистику групп. TanStack Query перезапрашивает только **смонтированные** запросы, остальные лишь помечает устаревшими, так что широкая инвалидация дешёвая.
- [ ] Тест на адресатов события.
Обнаружено при работе над #82.
Agent
added this to the v1.5 — изменение системы подсчёта рейтинга milestone 2026-09-18 23:21:03 +03:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Проблема
С #80 рейтинг у игрока один на всё приложение, и он — функция упорядоченной истории. Любое завершение, правка или удаление партии меняет:
rating_delta— у всех, кто играл после этой партии (правка прошлой партии пересчитывает всё после неё);SSE-инвалидация спроектирована под старый групповой рейтинг:
notify.match_changed/match_removed(backend/app/services/notify.py:30-69) шлют событие только участникам группы партии;useServerEvents.ts:58-67инвалидирует историю и профиль только участников этой партии; страницы групп — только группы партии.Комментарий там же «Общее меняется от любой партии: рейтинг глобальный» верен, но до игроков вне группы событие не доходит вовсе.
Сценарий
Данные не портятся — отстаёт только живое обновление.
Что сделать
announcements_changed), а не только группе.matchинвалидировать рейтинговые витрины целиком: топ, главную, свою статистику, все истории, профили и статистику групп. TanStack Query перезапрашивает только смонтированные запросы, остальные лишь помечает устаревшими, так что широкая инвалидация дешёвая.Обнаружено при работе над #82.