# QuoteForge v2.21 Дата релиза: 2026-06-25 Тег: `v2.21` ## Что нового ### Короткие ссылки на проекты и варианты - `GET /:code` — редирект на проект по коду опти (регистронезависимо); - `GET /:code/:variant` — редирект на конкретный вариант проекта; - валидация кода опти и имени варианта: только URL-безопасные символы `[A-Za-z0-9._-]` — проверка на бэкенде и в форме с подсказкой `«Используется в URL: /КОД/Вариант»`. ### Ревизия «до обновления цен» При нажатии «Обновить цены» автоматически создаётся ревизия текущего состояния конфигурации до применения новых цен, после чего сохраняется ревизия с обновлёнными ценами. История изменений теперь полная. ### Исправления - Старая цена в итоге конфигурации больше не зачёркивается, если цены фактически не изменились. - Устранён race condition: `SyncPricelists()` теперь защищена мьютексом — параллельный запуск фонового тикера и ручной синхронизации больше не приводит к `UNIQUE constraint failed`. - Дублирующиеся `lot_name` в серверном прайслисте пропускаются при загрузке вместо аварийного завершения синхронизации. - Ошибки отправки конфигураций и проектов на сервер теперь видны в диалоге «Информация о синхронизации» и в support bundle (`sync_log`, тип `changes`). - Состояние клиента (`last_sync_error_code` и др.) отправляется на сервер по завершении синхронизации независимо от её результата. ## Запуск на macOS Снимите карантинный атрибут через терминал: `xattr -d com.apple.quarantine /path/to/qfs-darwin-arm64` После этого бинарник запустится без предупреждения Gatekeeper.