Ревью изменений вехи 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 в репозиторий не добавлен: прод-путь проверен вручную, а после релиза этот одноразовый переход больше не понадобится.
## Что сделано
Ревью изменений вехи 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
Справка и краткое изложение документа обещали, что победитель не теряет рейтинг,
а последнее место его не приносит. Внутри общего места (ничья за 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
Решение владельца: в партии все выбывшие проиграли и одинаково слабы, миров у них
нет, поэтому пара двух выбывших в сумму не входит — ни 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
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.
Что сделано
Ревью изменений вехи v1.5 (
main...dev, рейтинг). Объявления #84 в охват не входили. Нашлось три проблемы, по каждой заведена задача в веху и сделан отдельный коммит. По ответу владельца на вопрос из #87 изменена и формула (#91). Кроме того, отдельно проверена миграция0014— на том пути, по которому она пойдёт на проде при релизе.N − 1прежние. В том же случае слабый выбывший теперь теряет −0.2 вместо +8.8. Менялись вместе:scoring.py, эталонsimulate.py, документ (4.3, 4.4, 4.9, пример 5, итоги 7.3 — сдвиг в третьем знаке, решение 8), справка.match, остальные активные игроки —ratings, если партия завершена или удалена. Фронт по обоим событиям сбрасывает все рейтинговые витрины, включая статистику других групп.Коммиты
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проведены вручную, последовательно по слоям.0014в репозиторий не добавлен: прод-путь проверен вручную, а после релиза этот одноразовый переход больше не понадобится.Closes #82
Closes #87
Closes #88
Closes #89
Closes #91
🤖 Generated with Claude Code
https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd