Ревью кода (#82) #90

Merged
NotBigGhost merged 4 commits from issue-82-code-review into dev 2026-09-18 23:42:36 +03:00
Collaborator

Что сделано

Ревью изменений вехи v1.5 (main...dev, рейтинг). Объявления #84 в охват не входили. Нашлось три проблемы, по каждой заведена задача в веху и сделан отдельный коммит. По ответу владельца на вопрос из #87 изменена и формула (#91). Кроме того, отдельно проверена миграция 0014 — на том пути, по которому она пойдёт на проде при релизе.

  • #87 — справка и краткое изложение документа обещали «победитель не теряет, последнее место не приносит». При ничьей это неверно: слабый выбывший среди сильных выбывших получал +8.8, сильный при ничьей за 1-е место теряет −2.9. Добавлена оговорка.
  • #91 — решение владельца: выбывшие между собой не сравниваются. Пара двух выбывших в сумму не входит, остальные пары и нормировка N − 1 прежние. В том же случае слабый выбывший теперь теряет −0.2 вместо +8.8. Менялись вместе: scoring.py, эталон simulate.py, документ (4.3, 4.4, 4.9, пример 5, итоги 7.3 — сдвиг в третьем знаке, решение 8), справка.
  • #88 — с #80 рейтинг общий, а SSE-событие о партии уходило только её группе, и история обновлялась только у участников. Теперь группа получает match, остальные активные игроки — ratings, если партия завершена или удалена. Фронт по обоим событиям сбрасывает все рейтинговые витрины, включая статистику других групп.
  • #89 — разбор полей целей и миров вынесен в одну функцию, места по раскладке считаются в одном месте.

Коммиты

  • 63f541d Рейтинг: монотонность — только без ничьей, в справке и документе
  • 6c35cb0 Итоги партии: общий разбор целей/миров и один расчёт мест
  • 5035ee4 События: общий рейтинг обновляется у всех, а не только в группе партии
  • 63a2cdd Рейтинг: выбывшие между собой не сравниваются

Проверки

  • pytest — 209 passed.
    • test_events_payload.py переписан под адресатов событий: на старом коде тип ratings не публиковался, проверка outsider in ratings падала бы.
    • Новый test_eliminated_are_not_compared_with_each_other: на старой формуле слабый выбывший получал +8.8, проверка < 0 падала бы.
    • test_monotone_and_zero_sum теперь требует, чтобы любой выбывший терял рейтинг.
  • python docs/rating/simulate.py (200 сезонов на сценарий): все примеры совпадают с документом, шкала инвариантна, итоги 7.3 перенесены в документ.
  • npm run build — успешно (typecheck + сборка).
  • Миграция на прод-пути: БД поднята схемой main (0015), в ней завершённые партии, незавершённая партия и черновик. Затем alembic upgrade head кодом dev → 0016. Участники и черновик сохранены, CHECK пересоздан с last_standing, бэкфилл сработал, foreign_key_check пуст.
  • Числа примеров в справке сверены с scoring.py; ASCII у run.ps1 и scripts/*.ps1 — чисто; остатков test-контура нет.

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

  • /code-review max трижды обрывался на лимите сессии: скил запускает много параллельных агентов. По решению владельца (лимит 52%) ревью и проход упрощений /simplify проведены вручную, последовательно по слоям.
  • Смена формулы (#91) в плане не стояла — это решение владельца по вопросу из #87. Перебор коэффициентов (7.4) после неё не переигрывался: сдвиг метрик в третьем знаке.
  • Тест миграции 0014 в репозиторий не добавлен: прод-путь проверен вручную, а после релиза этот одноразовый переход больше не понадобится.

Closes #82
Closes #87
Closes #88
Closes #89
Closes #91

🤖 Generated with Claude Code

https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd

## Что сделано Ревью изменений вехи v1.5 (`main...dev`, рейтинг). Объявления #84 в охват не входили. Нашлось три проблемы, по каждой заведена задача в веху и сделан отдельный коммит. По ответу владельца на вопрос из #87 изменена и формула (#91). Кроме того, отдельно проверена миграция `0014` — на том пути, по которому она пойдёт на проде при релизе. - **#87** — справка и краткое изложение документа обещали «победитель не теряет, последнее место не приносит». При ничьей это неверно: слабый выбывший среди сильных выбывших получал **+8.8**, сильный при ничьей за 1-е место теряет **−2.9**. Добавлена оговорка. - **#91** — решение владельца: **выбывшие между собой не сравниваются**. Пара двух выбывших в сумму не входит, остальные пары и нормировка `N − 1` прежние. В том же случае слабый выбывший теперь теряет −0.2 вместо +8.8. Менялись вместе: `scoring.py`, эталон `simulate.py`, документ (4.3, 4.4, 4.9, пример 5, итоги 7.3 — сдвиг в третьем знаке, решение 8), справка. - **#88** — с #80 рейтинг общий, а SSE-событие о партии уходило только её группе, и история обновлялась только у участников. Теперь группа получает `match`, остальные активные игроки — `ratings`, если партия завершена или удалена. Фронт по обоим событиям сбрасывает все рейтинговые витрины, включая статистику других групп. - **#89** — разбор полей целей и миров вынесен в одну функцию, места по раскладке считаются в одном месте. ## Коммиты - `63f541d` Рейтинг: монотонность — только без ничьей, в справке и документе - `6c35cb0` Итоги партии: общий разбор целей/миров и один расчёт мест - `5035ee4` События: общий рейтинг обновляется у всех, а не только в группе партии - `63a2cdd` Рейтинг: выбывшие между собой не сравниваются ## Проверки - `pytest` — 209 passed. - `test_events_payload.py` переписан под адресатов событий: на старом коде тип `ratings` не публиковался, проверка `outsider in ratings` падала бы. - Новый `test_eliminated_are_not_compared_with_each_other`: на старой формуле слабый выбывший получал +8.8, проверка `< 0` падала бы. - `test_monotone_and_zero_sum` теперь требует, чтобы любой выбывший терял рейтинг. - `python docs/rating/simulate.py` (200 сезонов на сценарий): все примеры совпадают с документом, шкала инвариантна, итоги 7.3 перенесены в документ. - `npm run build` — успешно (typecheck + сборка). - Миграция на прод-пути: БД поднята схемой `main` (`0015`), в ней завершённые партии, незавершённая партия и черновик. Затем `alembic upgrade head` кодом `dev` → `0016`. Участники и черновик сохранены, CHECK пересоздан с `last_standing`, бэкфилл сработал, `foreign_key_check` пуст. - Числа примеров в справке сверены с `scoring.py`; ASCII у `run.ps1` и `scripts/*.ps1` — чисто; остатков test-контура нет. ## Отклонения от плана - `/code-review max` трижды обрывался на лимите сессии: скил запускает много параллельных агентов. По решению владельца (лимит 52%) ревью и проход упрощений `/simplify` проведены вручную, последовательно по слоям. - Смена формулы (#91) в плане не стояла — это решение владельца по вопросу из #87. Перебор коэффициентов (7.4) после неё не переигрывался: сдвиг метрик в третьем знаке. - Тест миграции `0014` в репозиторий не добавлен: прод-путь проверен вручную, а после релиза этот одноразовый переход больше не понадобится. Closes #82 Closes #87 Closes #88 Closes #89 Closes #91 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
Agent added 3 commits 2026-09-18 23:30:03 +03:00
Справка и краткое изложение документа обещали, что победитель не теряет рейтинг,
а последнее место его не приносит. Внутри общего места (ничья за 1-е, несколько
выбывших) это не так — раздел 4.9 уже говорил «без ничьей». #87

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
parseCount и граница 99 — в domain/matchCounts.ts вместо двух копий в PlaceEditor
и AdminMatchEdit. В MatchDetailPage места по раскладке считает placeRows, из него
строятся и предупреждения, и строки для API. Поведение не меняется. #89

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
Рейтинг с #80 один на всё приложение: завершённая или удалённая партия двигает
топ, историю и профили всех, кто играл после неё, и страницы других групп.
Событие match по-прежнему идёт группе партии, остальным активным игрокам —
ratings без подробностей о партии. Фронт по обоим сбрасывает все рейтинговые
витрины (invalidateRatingViews); participant_ids больше не нужен. #88

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
NotBigGhost added 1 commit 2026-09-18 23:41:32 +03:00
Решение владельца: в партии все выбывшие проиграли и одинаково слабы, миров у них
нет, поэтому пара двух выбывших в сумму не входит — ни S − E, ни множитель отрыва.
Пары с невыбывшими считаются как прежде, нормировка на N − 1 тоже: при равных
рейтингах результат не меняется. Слабый выбывший больше не получает рейтинг за счёт
сильных выбывших.

Эталон — флаг skip_eliminated_pairs у предложенной системы; документ: 4.3, 4.4,
4.9, пример 5, итоги 7.3 пересчитаны (сдвиг в третьем знаке), решение 8 в разделе 9;
справка. #91

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
NotBigGhost merged commit bb5f2a1121 into dev 2026-09-18 23:42:36 +03:00
NotBigGhost deleted branch issue-82-code-review 2026-09-18 23:42:37 +03:00
Sign in to join this conversation.