Рейтинг: единый рейтинг вместо группового

Групповая цепочка убрана: рейтинг у игрока один, по всем партиям приложения
(решение владельца). load_history всегда грузит всю историю, одно
проигрывание на запрос. Страница группы: игры, победы, винрейт и среднее
место — по партиям группы, рейтинг — общий; «Новичок» тоже по общему числу
партий (новое поле rating_confirmed), поэтому опытный игрок в новой группе
ранжирован. Участники, не игравшие в группе, показывают общий рейтинг.
Главная и профиль — общие показатели; в блоке активной группы игры по
группе, рейтинг общий. У profile_stats убран неиспользуемый group_id.

Фронт: цвет рейтинга в списках берётся из rating_confirmed; справка —
«Один рейтинг на всё приложение». Документ рейтинга: раздел 8 и решение 7
в разделе 9.

Тесты: рейтинг в группах равен общему при групповых играх и победах,
главная и блок активной группы, ветеран в новой группе ранжирован,
«Ещё не играли» с общим рейтингом. #80

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
This commit is contained in:
2026-09-15 00:18:53 +03:00
co-authored by Claude Opus 5
parent 1c391448c1
commit 640f712037
10 changed files with 124 additions and 54 deletions
+6 -2
View File
@@ -670,8 +670,11 @@ M_{ab} = \operatorname{clamp}(A_{ab},\; 0.5,\; 2.0) \cdot c_{ab}
завершённых партий по порядку (`played_at`, `finished_at`, `id`), а не агрегатом SQL.
Данных мало: сотни партий, микросекунды на пару. Существующий принцип «считается вживую»
сохраняется, кэш можно ввести позже с инвалидацией по уже существующим SSE-событиям.
- **Две цепочки:** общий рейтинг — по всем партиям приложения, групповой — по партиям
группы. Это разные числа, как и сейчас.
- **Одна цепочка** (решение владельца 2026-09-15, #80): рейтинг у игрока один — по всем
партиям приложения, K — по всем его партиям. Отдельного группового рейтинга нет:
на странице группы игры, победы, винрейт и среднее место считаются по партиям группы,
а рейтинг и статус «Новичок» — общие. Первая версия реализации (#23) держала две
цепочки, общую и групповую, — это оказалось неинтуитивно (раздел 9).
- Правка или удаление прошлой партии автоматически меняет всё после неё: при пересчёте
с нуля отдельной логики не нужно.
- Эталон — `rate_match` в `simulate.py`. Примеры из раздела 6 стоит перенести в тесты
@@ -728,6 +731,7 @@ M_{ab} = \operatorname{clamp}(A_{ab},\; 0.5,\; 2.0) \cdot c_{ab}
| 4 | Ввод миров на конец партии | **Оставить** | без изменений: `w_w = 0.5` |
| 5 | Затухание за неактивность | **Не добавлять** | без изменений |
| 6 | Минимум партий для топа | **Оставить 10** | без изменений: `MIN_GAMES = 10` |
| 7 | Групповой рейтинг отдельной цепочкой (после внедрения, #80, 2026-09-15) | **Убрать.** Рейтинг единый; на странице группы — показатели по партиям группы, на главной и в профиле — общие | раздел 8, «Расчёт» |
Открытых вопросов по предложению не осталось. Калибровка коэффициентов на реальных данных —
после внедрения #23 (раздел 8, «Калибровка»).