Единый рейтинг вместо группового (#80) #81

Merged
NotBigGhost merged 2 commits from issue-80-single-rating into dev 2026-09-15 00:33:47 +03:00
Collaborator

Что сделано

По решению владельца рейтинг теперь один — по всем партиям приложения. Отдельной групповой цепочки нет.

  • Страница группы (текущий состав, #76): игры, победы, винрейт и среднее место считаются по партиям группы, рейтинг — общий, порядок — по общему рейтингу.
    • «Новичок» определяется по общему числу партий. Новое поле rating_confirmed означает MIN_GAMES+ партий всего. Поэтому опытный игрок в новой группе ранжирован, даже если сыграл в ней одну партию.
    • Участники, не игравшие в группе («Ещё не играли»), показывают свой общий рейтинг, если он есть.
  • Главная и профиль — общие показатели. В блоке «Активная группа» игры и победы по группе, рейтинг общий.
  • Код: load_history всегда грузит всю историю, одно проигрывание на запрос. У profile_stats убран неиспользуемый параметр group_id.
  • Фронт: цвет рейтинга (золото/серебро) в списках берётся из rating_confirmed, а не из блока, в котором стоит строка.
  • Справка: карточка «Один рейтинг на всё приложение». Документ рейтинга: раздел 8 «Расчёт» и решение 7 в разделе 9.

Исправление: «пустые» партии в профиле (второй коммит)

В профиле Ivan висели две карточки с одним участником, и они уходили в «Партия не найдена». Причин две.

  1. Партии без соперников.
    • Dev-удаление аккаунта (dev_admin) вычёркивает игрока из партий, но сами партии оставляет. 17.06 в dev-БД так опустели партии 2, 3, 6 и 7.
    • Такие партии засчитывались оставшемуся в число игр с ΔR 0.0 и показывались в истории и списке группы. Вдобавок бэкфилл 0014 проставил им last_standing.
    • Теперь партия меньше чем с двумя участниками — не игра: её нет в рейтинге и счётчиках, в истории игрока и в списке партий группы. Админка её по-прежнему видит и может удалить. Семантику самого dev-удаления не менял: она закреплена тестом.
    • Бэкфилл last_standing в 0014 теперь требует хотя бы двух участников. На уже мигрированной dev-БД такие партии и так скрыты.
  2. «Не найдена» вместо «нет доступа».
    • Из чужого профиля можно перейти в партию группы, где зритель не состоит; сервер отвечает 403. Судя по журналу аудита, в тот момент был вход под Epta, а он не состоит в группе «уууу».
    • Страница партии теперь так и пишет, а не «Партия не найдена». Правила доступа не менялись.

Коммиты

  • 640f712 Рейтинг: единый рейтинг вместо группового
  • 1e04f13 Рейтинг: партии без соперников не считаются, понятная причина недоступной партии

Проверки

  • .\.venv\Scripts\python.exe -m pytest — 194 passed. Новое и изменённое:
    • на страницах двух групп score равен общему, а игры и победы — групповые;
    • главная: профиль общий, блок активной группы — игры в группе и общий рейтинг;
    • ветеран (10 партий в одной группе) во второй группе ранжирован с games = 1, новичок — в «Новичках»;
    • в «Ещё не играли» опытный игрок стоит с общим рейтингом и rating_confirmed, не игравший нигде — без рейтинга;
    • партия, опустевшая после dev-удаления, не попадает в историю, список и счётчик группы; рейтинг считается только по настоящей партии;
    • на главной по-прежнему одна загрузка истории.
  • npm run gen:api + npm run build — зелёные.
  • HTTP на свежей копии dev-БД:
    • у всех игроков группы score совпадает с общим топом;
    • в истории Ivan больше нет партий 6 и 7 (7 партий вместо 9);
    • от лица Ivan все его партии открываются, от лица не участника группы — 403.
  • Бэкфилл 0014 на scratch-БД (откат до 0013, добавлена партия с одним участником, снова 0014): настоящая партия с одним выжившим получила last_standing, партия-обрубок осталась «по целям».
  • Не проверено: вёрстка в браузере — расширение Chrome не подключено.

Что ломается

  • Числа рейтинга на странице группы становятся общими, порядок в группе может измениться, часть «Новичков» в группах становится ранжированными.
  • Партии, где осталось меньше двух участников, пропадают из рейтинга, историй и списков партий. На проде их быть не может: dev-удаление там недоступно.
  • API: у LeaderboardEntry новое поле rating_confirmed. Данные и миграции не затрагиваются, кроме условия бэкфилла в ещё не выпущенной 0014.

Отклонения от плана

  • Второй коммит — исправление по замечанию владельца: пустые партии в профиле и сообщение о недоступной партии.
  • Партия 4 в dev-БД (из трёх участников осталось два, места 1 и 3) по-прежнему считается как дуэль. Её места выглядят странно, но это корректная партия двух игроков.

Closes #80

🤖 Generated with Claude Code

https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd

## Что сделано По решению владельца рейтинг теперь один — по всем партиям приложения. Отдельной групповой цепочки нет. - **Страница группы** (текущий состав, #76): игры, победы, винрейт и среднее место считаются по партиям группы, рейтинг — общий, порядок — по общему рейтингу. - «Новичок» определяется по общему числу партий. Новое поле `rating_confirmed` означает `MIN_GAMES`+ партий всего. Поэтому опытный игрок в новой группе ранжирован, даже если сыграл в ней одну партию. - Участники, не игравшие в группе («Ещё не играли»), показывают свой общий рейтинг, если он есть. - **Главная и профиль** — общие показатели. В блоке «Активная группа» игры и победы по группе, рейтинг общий. - **Код:** `load_history` всегда грузит всю историю, одно проигрывание на запрос. У `profile_stats` убран неиспользуемый параметр `group_id`. - **Фронт:** цвет рейтинга (золото/серебро) в списках берётся из `rating_confirmed`, а не из блока, в котором стоит строка. - **Справка:** карточка «Один рейтинг на всё приложение». **Документ рейтинга:** раздел 8 «Расчёт» и решение 7 в разделе 9. ### Исправление: «пустые» партии в профиле (второй коммит) В профиле Ivan висели две карточки с одним участником, и они уходили в «Партия не найдена». Причин две. 1. **Партии без соперников.** - Dev-удаление аккаунта (`dev_admin`) вычёркивает игрока из партий, но сами партии оставляет. 17.06 в dev-БД так опустели партии 2, 3, 6 и 7. - Такие партии засчитывались оставшемуся в число игр с ΔR 0.0 и показывались в истории и списке группы. Вдобавок бэкфилл 0014 проставил им `last_standing`. - Теперь партия меньше чем с двумя участниками — не игра: её нет в рейтинге и счётчиках, в истории игрока и в списке партий группы. Админка её по-прежнему видит и может удалить. Семантику самого dev-удаления не менял: она закреплена тестом. - Бэкфилл `last_standing` в 0014 теперь требует хотя бы двух участников. На уже мигрированной dev-БД такие партии и так скрыты. 2. **«Не найдена» вместо «нет доступа».** - Из чужого профиля можно перейти в партию группы, где зритель не состоит; сервер отвечает 403. Судя по журналу аудита, в тот момент был вход под Epta, а он не состоит в группе «уууу». - Страница партии теперь так и пишет, а не «Партия не найдена». Правила доступа не менялись. ## Коммиты - `640f712` Рейтинг: единый рейтинг вместо группового - `1e04f13` Рейтинг: партии без соперников не считаются, понятная причина недоступной партии ## Проверки - `.\.venv\Scripts\python.exe -m pytest` — **194 passed**. Новое и изменённое: - на страницах двух групп `score` равен общему, а игры и победы — групповые; - главная: профиль общий, блок активной группы — игры в группе и общий рейтинг; - ветеран (10 партий в одной группе) во второй группе ранжирован с `games = 1`, новичок — в «Новичках»; - в «Ещё не играли» опытный игрок стоит с общим рейтингом и `rating_confirmed`, не игравший нигде — без рейтинга; - партия, опустевшая после dev-удаления, не попадает в историю, список и счётчик группы; рейтинг считается только по настоящей партии; - на главной по-прежнему одна загрузка истории. - `npm run gen:api` + `npm run build` — зелёные. - **HTTP на свежей копии dev-БД:** - у всех игроков группы `score` совпадает с общим топом; - в истории Ivan больше нет партий 6 и 7 (7 партий вместо 9); - от лица Ivan все его партии открываются, от лица не участника группы — 403. - **Бэкфилл 0014 на scratch-БД** (откат до 0013, добавлена партия с одним участником, снова 0014): настоящая партия с одним выжившим получила `last_standing`, партия-обрубок осталась «по целям». - **Не проверено:** вёрстка в браузере — расширение Chrome не подключено. ## Что ломается - Числа рейтинга на странице группы становятся общими, порядок в группе может измениться, часть «Новичков» в группах становится ранжированными. - Партии, где осталось меньше двух участников, пропадают из рейтинга, историй и списков партий. На проде их быть не может: dev-удаление там недоступно. - API: у `LeaderboardEntry` новое поле `rating_confirmed`. Данные и миграции не затрагиваются, кроме условия бэкфилла в ещё не выпущенной 0014. ## Отклонения от плана - Второй коммит — исправление по замечанию владельца: пустые партии в профиле и сообщение о недоступной партии. - Партия 4 в dev-БД (из трёх участников осталось два, места 1 и 3) по-прежнему считается как дуэль. Её места выглядят странно, но это корректная партия двух игроков. Closes #80 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
Agent added 1 commit 2026-09-15 00:19:16 +03:00
Групповая цепочка убрана: рейтинг у игрока один, по всем партиям приложения
(решение владельца). 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
NotBigGhost added 1 commit 2026-09-15 00:31:06 +03:00
В профиле Ivan висели две «партии» с одним участником, которые не
открывались. Dev-удаление аккаунта (dev_admin) вычёркивает игрока из партий,
не трогая сами партии, и 17.06 в dev-БД так опустели партии 2, 3, 6 и 7.
Они засчитывались оставшемуся в число игр с ΔR 0.0, показывались в истории
и списке группы, а бэкфилл 0014 проставил им last_standing.

Партия меньше чем с двумя участниками больше не считается игрой: её нет
в рейтинге и счётчиках (load_history), в истории игрока и в списке партий
группы; админка её по-прежнему видит. Бэкфилл last_standing в 0014 теперь
требует хотя бы двух участников (на уже мигрированных БД такие партии и так
скрыты).

«Партия не найдена» при переходе из чужого профиля в партию группы, где
зритель не состоит, — это 403; страница партии теперь так и пишет.

Тест: партия, опустевшая после dev-удаления, не попадает в историю, список
и счётчик группы, рейтинг считается только по настоящей партии. #80

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
NotBigGhost merged commit 526e4adf0c into dev 2026-09-15 00:33:47 +03:00
NotBigGhost deleted branch issue-80-single-rating 2026-09-15 00:33:48 +03:00
Sign in to join this conversation.