Files
ds-galo/Отчёты об изменениях/2026-10-23-описание-релиза.md
iu 4cc5c0f340 docs(release): версия 0.2.0
Релиз Galo 0.2.0: инструмент «Цвет», пресеты тоновой кривой, мерж настроек профиля и исправления переключения фото.
2026-10-23 23:09:06 +03:00

146 lines
10 KiB
Markdown

# Описание релиза Galo — 23 октября 2026
**Версия:** `0.2.0`
**База релиза:** `0.1-alpha` (`723b19b`, 21 октября 2026) → `develop` (`9e39e3d`, 23 октября 2026)
**Объём:** 6 коммитов, 3 спецификации обновлены, 2 изменения реализованы
---
## Коротко о главном
1. **Инструмент «Цвет».** Баланс белого, вибрация и насыщенность, цветовой
микшер по восьми диапазонам оттенков, цветокоррекция по зонам яркости и
общая поканальная коррекция. Предпросмотр считает WebGL2, есть WASM/JS-фолбэк.
2. **Пресеты тоновой кривой.** Плавная монотонная кривая (PCHIP), подвижные
крайние точки и плоские полки. Встроенные и пользовательские пресеты всех
четырёх каналов хранятся в профиле, импортируются и экспортируются JSON-файлом.
3. **Настройки профиля больше не затирают друг друга.** Сохранение сведений о фото
и пресетов кривой мержится на сервере по разделам.
4. **Исправлено переключение фото в редакторе.** Вкладка правой панели сохраняется,
а несохранённые правки уходят тому фото, для которого сделаны.
---
## Новые возможности
### Инструмент «Цвет»
- **Баланс белого:** температура и оттенок, пипетка по нейтральной точке на фото.
- **Вибрация и насыщенность** с раздельными ползунками.
- **Цветовой микшер** по восьми диапазонам (красный, оранжевый, жёлтый, зелёный,
бирюзовый, синий, фиолетовый, пурпурный): тон, насыщенность и яркость каждого
диапазона.
- **Цветокоррекция по зонам:** колёса теней, средних тонов и светов, наложение и
баланс зон.
- **Поканальная коррекция** красного, зелёного и синего каналов.
- **Живой предпросмотр на WebGL2:** кадр считает GPU, поэтому изменения видны сразу.
Если WebGL2 недоступен, используется WASM/JS-фолбэк с тем же результатом.
- Ползунки с градиентами, цветовые колёса и сброс значения двойным кликом.
- Порядок операций совпадает в Go-рендере, WASM и JS-предпросмотре; паритет
закреплён тестами.
### Тоновая кривая и пресеты
- **Плавная кривая:** монотонная кубическая интерполяция (PCHIP) вместо прямых
отрезков — и в SVG-графике, и в LUT для предпросмотра и серверного рендера.
- **Крайние точки** `(0,0)` и `(1,1)` существуют сразу, двигаются по обеим осям;
вне крайних точек кривая остаётся плоской. Первый клик по полю вставляет точку
между крайними.
- **Встроенные пресеты:** «Линейный», «Средний контраст», «Сильный контраст».
Контраст задаётся в RGB, каналы R/G/B остаются линейными.
- **Пользовательские пресеты** описывают кривые всех четырёх каналов:
- сохранение, применение, переименование и удаление;
- хранение в `users.preferences.curve_presets` в профиле пользователя;
- приватность: чужие пресеты не видны;
- импорт и экспорт JSON `{ "version": 1, "presets": [...] }`, upsert по имени;
- старый формат одного канала конвертируется при чтении.
- Подпись показывает активный пресет; при ручной правке любого канала —
«Пользовательский». Сброс возвращает линейную кривую.
### Настройки профиля
- `PATCH /api/auth/me/preferences` теперь **мержит** разделы, а не заменяет весь
JSON-объект.
- Сохранение `photo_info` не стирает `curve_presets`, и наоборот.
- Валидация: не больше 100 пресетов, имя 1..64 символа, 2..16 точек на каждый из
четырёх каналов, `x/y` в диапазоне 0..1.
- Неизвестные разделы настроек сохраняются без изменений.
---
## Исправления
- **Переключение фото в редакторе.** Вкладка правой панели больше не сбрасывается
на «Сведения». Накопленные правки отправляются фото, для которого сделаны, даже
если пользователь уже перешёл к следующему.
- **Фоновые сохранения не подменяют текущее фото.** Устаревшие ответы сохранения и
загрузки игнорируются; панель показывает только фото текущего маршрута.
- **Копия фото не наследует отредактированную версию.** Копия показывает исходник,
правка принадлежит своему фото (архивная синхронизация спецификации
`media-objects`).
- Устранены ошибки доступа к `photo = null` при кратковременной смене фото.
---
## Технические изменения
### API
- `PATCH /api/auth/me/preferences` — мерж известных разделов; в ответе возвращается
полный объединённый объект.
- `PATCH /api/photos/:id/edit` — параметры правок теперь включают блок `color` и
тоновую кривую; серверный рендер использует те же LUT, что и предпросмотр.
- `DELETE /api/photos/:id/edit` — сброс правок без изменений.
### Данные и миграции
- Схема БД не менялась: новые настройки лежат в JSON-блобе
`users.preferences`; параметры правок — в `photos.edit_params`.
- Новые роли объектов и миграции не добавлялись.
- Старые сохранённые кривые начнут интерполироваться плавно — визуальный результат
может немного измениться без миграции данных.
### Сборка
- Обновлён WASM-модуль фильтров (`frontend/static/light.wasm`).
- `make build-release` собирает статический бинарник с вшитой версией и сжимает
его UPX, если UPX доступен.
- Версия берётся из `git describe --tags`; релизный тег — `0.2.0`.
### Проверка
- `npm run check` — 0 ошибок и предупреждений.
- `npm run test` — 54 теста.
- `go test ./...` — все пакеты зелёные.
- E2E: сохранение/сброс цветовых правок, приватность и хранение пресетов кривой.
- Проверено в браузере: WebGL2-предпросмотр, пипетка, меню пресетов, сохранение
всех каналов, сохранение вкладки и правок при переключении фото.
---
## Как обновиться
1. Собрать релизный бинарник: `make build-release` (или взять готовый
`bin/galo-0.2.0`).
2. Остановить сервис и заменить бинарник. Фронтенд вшит в бинарник.
3. Запустить сервис: миграции применяются автоматически при старте для выбранного
бэкенда. Для этого релиза отдельных миграций нет.
4. Для видео по-прежнему нужны `ffmpeg`/`ffprobe` на хосте.
5. Android-клиент обновляется отдельно через `make install-android-app`.
Откат: вернуть предыдущий бинарник. Схема не менялась, данные правок и профиля
остаются совместимыми; новые ключи настроек старый бинарник просто игнорирует.
---
## Ограничения
- Редактирование цвета и кривой доступно только для изображений; видео не
редактируется.
- WebGL2-предпросмотр ускоряет отрисовку, но при его отсутствии используется
WASM/JS-фолбэк.
- Пресеты не синхронизируются между пользователями: перенос возможен только через
экспорт/импорт JSON.
- Правки не создают отдельной записи в истории: параметры хранятся в метаданных
фото, отредактированная версия — отдельный объект.