Почему: хук пинил ruff v0.7.4, CI и `uv run ruff format` брали ruff из
lock'ов (0.15.12 в backend/, 0.15.20 в tradein-mvp/). Разные версии
по-разному форматируют длинные assert-сообщения — хук переписывал
нетронутые строки и ронял коммит на каждом касании файла (сегодня трижды),
а следующий `ruff format` возвращал как было. Дрейф нигде не краснел:
`ruff format --check` намеренно не в CI.
Что: rev → v0.15.20 (тег есть), `ruff==0.15.20` в обоих pyproject (с `>=`
любой `uv lock --upgrade` снова уведёт lock от хука), `uv lock` — в
lock'ах поменялся только ruff. Гейт test_2864_ruff_version_alignment.py:
rev == версии в обоих lock'ах == пин в pyproject; на origin/main красный
по значению (v0.7.4 ≠ 0.15.12 ≠ 0.15.20). `ruff check` 0.15.20 зелёный
на обоих проектах.
Нормализация 160 файлов под 0.15.20 — отдельным PR (только формат).
Refs #2864